Загружайте и сохраняйте непрозрачные 8-битные файлы PNG, используя 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 ответ
Начиная с 1.0.0-бета0005, отсутствует формат пикселей Gray8, потому что мы не могли решить, какую цветовую модель использовать при конвертации из Rgb (нам это нужно внутренне). Рекомендация МСЭ-R BT.709 кажется разумным решением, потому что это то, что поддерживает png и что мы используем при сохранении изображения как 8-битного png в градациях серого, поэтому оно находится в моем списке TODO.
https://en.wikipedia.org/wiki/Grayscale
Итак... в настоящее время вам нужно использовать либо Rgb24
или же Rgba32
при декодировании изображений.
Обновить.
Начиная с 1.0.0-dev002094 это стало возможным! У нас есть два новых формата пикселей. Gray8
а также Gray16
которые несут только компонент яркости пикселя.
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 по умолчанию сохранит изображение в соответствии с типом входного цвета и глубиной цвета. Если вы хотите закодировать изображение в другой цветовой тип, вам нужно будет PngEncoder
экземпляр с ColorType
а также BitDepth
свойства установлены.