2

我通过 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 

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

4

2 回答 2

1
    u16MagickImg.quality(00);
    u16MagickImg.defineSet("png:color-type", "0");
    u16MagickImg.defineSet("png:bit-depth", "16");
于 2011-10-11T17:05:46.547 回答
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 由 value_ 指定。如果必须完全删除 key,请参见 defineSet() 方法。 " defineSet: "设置或获取定义标志以在对指定格式进行编码或解码时应用。. 类似于 defineValue() 方法,不同之处在于传递 flag_ 值 'true' 会创建一个具有该格式和键的无值定义。传递 flag_ 值 'false' 会删除任何现有的匹配定义。如果匹配键存在,则该方法返回“true”,如果不存在,则返回“false”匹配键存在。”

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

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

希望这可以帮助。

于 2014-02-27T08:15:54.413 回答