Как установить битовую глубину в Magick.NET Read

Как указать битовую глубину для функции MagickImage.Read() при чтении двоичных файлов?

У меня есть изображение 1024x1024, представленное 8-битными значениями в градациях серого (общая длина файла = 1024x1024 = 1048576 байт). Используя ImageMagick v.7.0.8-7 Q16 x64, я могу конвертировать файл используя

magick.exe -depth 8 -size 1024x1024 -format Gray Gray:filepath.bin convertedfile.png

Когда я пытаюсь конвертировать файл с помощью Magick.NET Q16-AnyCPU v7.5.0.1,

public MagickImage ReadNewMagickImageFromBinary(string fileName){
    MagickReadSettings settings = new MagickReadSettings();

    settings.Width = 1024;
    settings.Height = 1024; //if I use settings.Height = 512; , I'm OK.
    settings.Format = MagickFormat.Gray;
    //settings.Depth = 8;                                   //didn't work
    //settings.SetDefine(MagickFormat.Gray, "depth", "8");  //also didn't work

    MagickImage newImage = new MagickImage();
    newImage.Depth = 8; //this appears to be ignored once the Read function is called
    newImage.Read(fileName, settings);

    return newImage;
}

Я получаю ошибку

Сообщение: ImageMagick.MagickCorruptImageErrorException: неожиданный конец файла '': нет такого файла или каталога @ error/gray.c/ReadGRAYImage/241

Указывает, что программа прочитала после конца файла. Я подтвердил, что Magick.NET возвращается на 16-битную глубину вместо 8-битной глубины, которую я хочу. Я могу прочитать файл, используя settings.Height = 512 вместо 1024, что дает мне сжатую версию моего изображения в градациях серого.

Из использования памяти в Magick.NET я узнал, что Magick.NET Q16 сохраняет пиксели в памяти с 16-битной точностью; Я в порядке с этим, но, похоже, это не должно исключать возможности 8-битного чтения.

Как заставить Magick.NET Q16 считывать пиксели с 8-битной глубиной?

2 ответа

Решение

Я только что опубликовал Magick.NET 7.6.0.0, который теперь имеет лучший API для чтения необработанных пикселей. Вы должны изменить свой код на это:

public MagickImage ReadNewMagickImageFromBinary(string fileName)
{
    var width = 1024;
    var height = 1024;
    var storageType = StorageType.Char;
    var mapping = "R";
    var pixelStorageSettings = new PixelStorageSettings(width, height, storageType, mapping);

    return new MagickImage(fileName, pixelStorageSettings);
}

Одним из обходных путей является использование Magick.NET Q8 версия вместо Magick.NET Q16, Я успешно прочитал файл с помощью программы Magick.NET Q8-AnyCPU 7.5.0.1,

Я все еще надеюсь, что есть решение, которое позволяет мне все еще использовать Magick.NET Q16, но это работает на данный момент.

Другие вопросы по тегам