使用 ImageSharp 加载和保存不透明的 8 位 PNG 文件

Load and Save opaque 8 bit PNG Files using ImageSharp

我正在尝试加载 -> 直接操作字节数组 -> 保存 8 位 png 图像。

我想使用 ImageSharp 将其速度与我当前的库进行比较,但是在他们的代码示例中,他们需要定义像素类型(他们使用 Rgba32):

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

// Image.Load(string path) is a shortcut for our default type. 
// Other pixel formats use Image.Load<TPixel>(string path))
using (Image<Rgba32> image = Image.Load("foo.jpg"))
{
    image.Mutate(x => x
         .Resize(image.Width / 2, image.Height / 2)
         .Grayscale());
    image.Save("bar.jpg"); // Automatic encoder selected based on extension.
}

我查看了像素类型:https://github.com/SixLabors/ImageSharp/tree/master/src/ImageSharp/PixelFormats

但是没有灰度8位像素类型

截至 1.0.0-beta0005 没有 Gray8 像素格式,因为我们无法决定从 Rgb 转换时使用哪种颜色模型(我们内部需要)。 ITU-R Recommendation BT.709 似乎是明智的解决方案,因为这是 png 支持的内容,也是我们在将图像保存为 8 位灰度 png 时使用的内容,因此它在我的 TODO 列表中。

https://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale

所以...当前解码图像时需要使用Rgb24Rgba32

更新。

1.0.0-dev002094 开始,这成为可能!我们有两种新的像素格式。 Gray8Gray16 仅携带像素的亮度分量。

using (Image<Gray8> image = Image.Load<Gray8>("foo.png"))
{
    image.Mutate(x => x
         .Resize(image.Width / 2, image.Height / 2));

    image.Save("bar.png");
}

注意。默认情况下,png 编码器将以输入的颜色类型和位深度保存图像。如果您想以不同的颜色类型对图像进行编码,则需要使用 ColorTypeBitDepth 属性集新建一个 PngEncoder 实例。