如何使用Magick ++为具有透明背景的png图像设置不透明度

How to set opacity to png image with transparent background using Magick++

我正在使用 ImageMagick 渲染图像。 我打开 png file as Magick::Image and draw it on another Magick::Image and set opacity to png image. And save it as jpg file.

在保存的文件中,透明背景变为黑色。

示例代码:

    Image newImage;
    newImage.size(Geometry(1000, 1000));
    newImage.fillColor(Color(50, TransparentOpacity / 2, 50));
    newImage.draw(DrawableRectangle(0, 0, 1000, 1000));

    Image originalImage("test-Image-1.png");
    originalImage.opacity(TransparentOpacity / 2);
    newImage.composite( originalImage, 300, 100, AtopCompositeOp );

    newImage.magick("JPG");
    newImage.write("testImage3.jpg");

是否可以将图像透明度设置为 50%,背景完全透明?

问题在于行:

originalImage.opacity(TransparentOpacity / 2);

来源 "test-Image-1.png" 的 alpha 通道看起来像...

当您将不透明度设置为 50% 时,您设置的是整个通道,而不是将级别降低 50%。用 originalImage.opacity 改变的 alpha 通道现在看起来像这样...

有很多方法可以改变 alpha 通道以减少 图像不透明度。 Pixel iteration, FX, and level color 仅举几例。我喜欢隔离 alpha 通道、改变级别并将通道复制回图像。下面的示例只是 "swaps" 颜色值作为 50% 不透明度 == gray50.

Image originalImage("test-Image-1.png");
Image mask(originalImage); // Clone image
mask.channel(OpacityChannel); // Isolate alpha-channel
/*
  For this example I'll mimic CLI options:
  "-fuzz 50% -fill gray50 -opaque black"
*/
mask.colorFuzz(MaxRGB * 0.5);
mask.opaque(Color("black"), Color("gray50"));
mask.negate();
// Copy mask image as new alpha-channel
originalImage.composite( mask, 0, 0, CopyOpacityCompositeOp );

现在您可以在另一张图片上进行合成而不用担心黑色背景。