2011-10-11 157 views
2

我通过Magick ++ API链接到ImageMagick。我试图将uint16数据输出为1024x768 1通道16位灰度PNG。我从下面得到的输出是RGB8 PNG。除格式化之外,图像内容是正确的。ImageMagick C++ API输出16位灰度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 

在命令行上会具有所需的输出

回答

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

我试图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

见的信息 http://www.imagemagick.org/Magick++/Image.html

从那里行情:

的Image类在这里defineValue和defineSet方法意义

defineValue:“设置或获取要在编码或解码指定格式时应用的定义字符串。定义的含义是格式特定的。格式由magick_参数指定,格式特定的键由key_指定,关联的值由value_指定。 如果必须完全删除密钥,请参阅defineSet()方法。 “” defineSet:“设置或获取定义标志以在编码或解码指定格式时应用。与defineValue()方法类似,不同之处在于传递flag_值”true“会创建一个无值定义,并使用该格式和键。传递flag_值'false'会删除任何现有的匹配定义。如果存在匹配关键字,则该方法返回“真”;如果不存在匹配关键字,则返回“假”。

此外,还有一些来自png.c源文件的重要信息: 如果图像无法无损写入请求的位深度和颜色类型,PNG文件将不会写入,将发出警告,并且编码器将返回MagickFalse。

我不是专家,不确定它会在您的特定情况下工作,但上面的代码实际上是在OS X ImageMagick 10.6.9上为我工作的。

希望这会有所帮助