Class WriterOptions
Options for writing. Each format has a subclass with its own settings; writers given this base class use their defaults.
public class WriterOptions
- Inheritance
-
WriterOptions
- Derived
- Inherited Members
Examples
/// <summary>A minimal format: "RAW8", width and height as big-endian numbers, then RGBA rows.</summary>
public static class Raw8Format
{
public static FormatInfo Info { get; } = new()
{
Name = "RAW8",
Extensions = ["raw8"],
SignatureLength = 4,
Matches = header => header.StartsWith("RAW8"u8),
Reader = new Reader(),
Writer = new Writer(),
};
private sealed class Reader : IFormatReader
{
public RasterInfo ReadInfo(EgamiInput input, ReaderOptions options)
{
(int width, int height) = Header(input);
return new RasterInfo { Format = Info, Width = width, Height = height, Layout = Rgba8.Layout, FrameCount = 1, EstimatedBytes = 4L * width * height };
}
public Raster<TPixel> Read<TPixel>(EgamiInput input, ReaderOptions options)
where TPixel : unmanaged, IPixelType<TPixel>
{
(int width, int height) = Header(input);
// CreateRaster checks the size against the safety limits before allocating.
Raster<TPixel> raster = input.CreateRaster<TPixel>(width, height);
using IMemoryOwner<byte> row = input.RentScratch(width * 4);
for (int y = 0; y < height; y++)
{
input.ReadExactly(row.Memory.Span[..(width * 4)]);
PixelConvert.Convert<Rgba8, TPixel>(MemoryMarshal.Cast<byte, Rgba8>(row.Memory.Span[..(width * 4)]), raster.Row(y));
}
return raster;
}
public Raster Read(EgamiInput input, ReaderOptions options) => Read<Rgba8>(input, options);
private static (int Width, int Height) Header(EgamiInput input)
{
input.Skip(4);
return ((int)input.ReadUInt32BigEndian(), (int)input.ReadUInt32BigEndian());
}
}
private sealed class Writer : IFormatWriter
{
public void Write<TPixel>(Raster<TPixel> raster, Stream output, WriterOptions options)
where TPixel : unmanaged, IPixelType<TPixel>
{
Span<byte> header = stackalloc byte[12];
"RAW8"u8.CopyTo(header);
BinaryPrimitives.WriteUInt32BigEndian(header[4..], (uint)raster.Width);
BinaryPrimitives.WriteUInt32BigEndian(header[8..], (uint)raster.Height);
output.Write(header);
Rgba8[] row = new Rgba8[raster.Width];
for (int y = 0; y < raster.Height; y++)
{
PixelConvert.Convert<TPixel, Rgba8>(raster.Row(y), row);
output.Write(MemoryMarshal.AsBytes(row.AsSpan()));
}
}
}
}
Properties
Default
Gets the default options.
public static WriterOptions Default { get; }
Property Value
OmitSrgbProfile
Gets whether to leave out an embedded ICC profile that means sRGB (IsEquivalentTo(ColorProfile)), which saves about 3 KB on a web image; PNG writes its small sRGB chunk instead. Defaults to false, so output is as in 1.0.
public bool OmitSrgbProfile { get; init; }
Property Value
Examples
// Leave out an embedded profile that only says sRGB, which is what a file without one means anyway.
raster.Save(output, "png", new WriterOptions { OmitSrgbProfile = true });
StripMetadata
Gets whether to leave out all metadata. Defaults to false: writers keep whatever their format supports.
public bool StripMetadata { get; init; }