2

读取二进制文件时,如何为 MagickImage.Read() 函数指定位深度?

我有一个由 8 位灰度值表示的 1024x1024 图像(总文件长度 = 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 位深度。我可以使用而不是 1024 来读取文件settings.Height = 512,这给了我灰度图像的压缩版本。

我从Magick.NET 中的内存消耗中了解到,Magick.NET Q16 以 16 位精度将像素存储在内存中;我对此很好,但似乎不应该排除 8 位读取功能。

如何强制 Magick.NET Q16 读取 8 位深度的像素?

4

2 回答 2

1

我刚刚发布了 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);
}
于 2018-07-29T18:56:39.970 回答
0

一种解决方法是使用Magick.NET Q8版本而不是Magick.NET Q16. 我使用该程序成功读取了文件Magick.NET Q8-AnyCPU 7.5.0.1

我仍然希望有一个解决方案可以让我仍然使用Magick.NET Q16,但这目前有效。

于 2018-07-23T21:43:32.153 回答