Загружайте и сохраняйте непрозрачные 8-битные файлы PNG, используя ImageSharp - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь загрузить -> манипулировать байтовым массивом напрямую -> сохранить 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.
}

Iпросмотрел типы пикселей: https://github.com/SixLabors/ImageSharp/tree/master/src/ImageSharp/PixelFormats

Но 8-битного типа пикселей в оттенках серого не существует.

1 Ответ

0 голосов
/ 24 сентября 2018

По состоянию на 1.0.0-бета0005 Нет формата пикселей Gray8, потому что мы не могли решить, какую цветовую модель использовать при преобразовании из Rgb (нам это нужно внутренне).Рекомендация МСЭ-R BT.709 кажется разумным решением, потому что это то, что поддерживает png и что мы используем при сохранении изображения как 8-битного png в градациях серого, поэтому оно находится в моем списке TODO.

https://en.wikipedia.org/wiki/Grayscale#Converting_color_to_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.

...