我通过Magick++应用程序接口链接到ImageMagick。我正在尝试获取uint16数据并将其输出为1024x768 1通道16位灰度PNG。我从下面得到的输出是一个RGB8 PNG。除了格式之外,图像内容也是正确的。
gray16_view_t u16view = ...;
uint16_t* data = interleaved_view_get_raw_data(u16view);
size_t length = sizeof(u16) * u16view.width() * u16view.height();
Magick::Blob u16Blob(data, length);
Magick::Geometry size(u16view.width(), u16view.height());
Magick::Image u16MagickImg(u16Blob, size, 16, "GRAY");
u16MagickImg.write("test-16bit.png");有没有办法指定更多关于输出格式的信息?
这里有一些关于imagemagick的PNG处理的讨论:http://www.imagemagick.org/Usage/formats/#png_formats他们列出了PNG8、PNG24和PNG32作为可用的格式,但下面的部分暗示了
-define png:bit-depth 16
-define png:color-type=0 在命令行上将会有所需的输出
发布于 2011-10-12 01:05:47
u16MagickImg.quality(00);
u16MagickImg.defineSet("png:color-type", "0");
u16MagickImg.defineSet("png:bit-depth", "16");发布于 2014-02-27 16:15:54
我试过defineSet,它对我不起作用,但next起作用了:
image.defineValue("png", "format", "png24");我的情况有点不同,所以我使用了不同的png格式说明符和值,在你的例子中应该是:
u16MagickImg.defineValue("png", "color-type", "0");
u16MagickImg.defineValue("png", "bit-depth", "16");请参阅此处的格式说明符列表:http://www.imagemagick.org/script/command-line-options.php#define
有关Image类的defineValue和defineSet方法的含义的信息,请参阅此处:http://www.imagemagick.org/Magick++/Image.html
引述自该网站:
defineValue:“设置或获取指定格式编码或解码时应用的定义字符串。定义的含义是特定于格式的。格式由magick_参数指定,特定于格式的键由key_指定,关联值由value_指定。如果必须完全删除密钥,请参阅defineSet()方法。“defineSet:”设置或获取在编码或解码指定格式时应用的定义标志。与defineValue()方法类似,不同之处在于传递flag_值'true‘会创建使用该格式和键定义的值较少的值。传递flag_值'false‘将删除任何现有的匹配定义。如果存在匹配键,则该方法返回'true‘,如果不存在匹配键,则返回'false’。“
还有一些来自png.c源文件的重要信息:如果图像不能以请求的位深度和颜色类型无损失地写入,则不会写入PNG文件,将发出警告,并且编码器将返回MagickFalse。
我不是专家,也不确定它是否适用于您的特定情况,但上面的代码确实适用于我在OS X ImageMagick 10.6.9上的工作。
希望这能有所帮助。
https://stackoverflow.com/questions/7728550
复制相似问题