首页 > 解决方案 > 当 alpha 为零时,RGB 分量在调整大小时丢失

问题描述

我在 C++ 中使用 ImageMagick 的 Magick++ API 将 RGBA 图像缩小一半。

Magick::Image input(input_file);
input.flip();
input.resize(Magick::Geometry(image.px_width, image.px_height));
Magick::Blob blob;
input.write(&blob, "RGBA");
//input.write("out.png"); // Behaves the same

源图像

原始文件:https ://i.stack.imgur.com/BoYyH.png

以 alpha 为透明度的 RGBA:https ://i.stack.imgur.com/MuGQm.png

仅 RGB 通道:https ://i.imgur.com/1ZRp2K9.png

单独的 Alpha 通道:https ://i.imgur.com/gpjTxVJ.png

注意三个彩色点和 Alpha 通道为零的 RGB 通道。

输出图像

以 alpha 为透明度的 RGBA:https ://i.imgur.com/V9aF6S5.png

仅 RGB 通道:https ://i.imgur.com/ERIbiMS.png

Alpha 通道是正确的。

三个点消失了。似乎 ImageMagick 认为由于点是完全透明的,它可以丢弃信息。问题是,有价值的信息会丢失并破坏期望这些数据的渲染图像。

当我通过convertutil 运行图像时,我得到了同样的破坏行为:

$ convert in.png -resize 512x512 out.png

我能够用这个命令修复它:

$ convert in.png -channel RGBA -separate -resize 512x512 -combine out.png

如何使用 Magick++ API 实现这种正确的行为?

标签: imagemagickimagemagick-convertmagick++

解决方案


推荐阅读