ImageMagick C ++ API输出16位灰度png?

时间:2011-10-11 15:28:25

标签: c++ imagemagick png magick++

我通过Magick ++ API链接到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 
命令行上的

将具有所需的输出

2 个答案:

答案 0 :(得分:1)

    u16MagickImg.quality(00);
    u16MagickImg.defineSet("png:color-type", "0");
    u16MagickImg.defineSet("png:bit-depth", "16");

答案 1 :(得分:1)

我试过了defineSet,它对我不起作用,但接下来有效:

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_ value'false'删除任何现有的匹配定义。如果存在匹配的密钥,则该方法返回'true',如果不存在匹配的密钥,则返回'false'。“

png.c源文件中的一些重要信息: 如果无法使用请求的位深度和颜色类型写入图像,则不会写入PNG文件,将发出警告,编码器将返回MagickFalse。

我不是专家,也不确定它是否适用于您的特定情况,但上面的代码在OS X ImageMagick 10.6.9上实际上对我有用。

希望这有帮助。