如何在 Magick.NET 阅读中设置位深度
How to set bit depth in Magick.NET Read
如何在读取二进制文件时指定 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;
}
我收到错误
Message: ImageMagick.MagickCorruptImageErrorException : unexpected
end-of-file '': No such file or directory @
error/gray.c/ReadGRAYImage/241
表明程序已经读过了文件末尾。我已经确认 Magick.NET 正在恢复到 16 位深度,而不是我想要的 8 位深度。我可以使用 settings.Height = 512
而不是 1024 来读取文件,这为我提供了灰度图像的压缩版本。
从Memory consumption in Magick.NET了解到Magick.NETQ16在内存中以16位精度存储像素;我对此很好,但似乎不应该排除 8 位读取功能。
如何强制 Magick.NET Q16 以 8 位深度读入像素?
一种解决方法是使用 Magick.NET Q8
版本而不是 Magick.NET Q16
。我使用程序 Magick.NET Q8-AnyCPU 7.5.0.1
.
成功读取了文件
我仍然希望有一个解决方案可以让我继续使用 Magick.NET Q16
,但这暂时有效。
我刚刚发布了 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);
}
如何在读取二进制文件时指定 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;
}
我收到错误
Message: ImageMagick.MagickCorruptImageErrorException : unexpected end-of-file '': No such file or directory @ error/gray.c/ReadGRAYImage/241
表明程序已经读过了文件末尾。我已经确认 Magick.NET 正在恢复到 16 位深度,而不是我想要的 8 位深度。我可以使用 settings.Height = 512
而不是 1024 来读取文件,这为我提供了灰度图像的压缩版本。
从Memory consumption in Magick.NET了解到Magick.NETQ16在内存中以16位精度存储像素;我对此很好,但似乎不应该排除 8 位读取功能。
如何强制 Magick.NET Q16 以 8 位深度读入像素?
一种解决方法是使用 Magick.NET Q8
版本而不是 Magick.NET Q16
。我使用程序 Magick.NET Q8-AnyCPU 7.5.0.1
.
我仍然希望有一个解决方案可以让我继续使用 Magick.NET Q16
,但这暂时有效。
我刚刚发布了 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);
}