-2

我正在使用 ImageMagick 来渲染图像。我将png 文件打开为 Magick::Image 并将其绘制在另一个 Magick::Image 上并将不透明度设置为 png 图像。并将其保存为jpg 文件

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

示例代码:

    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% 并将背景设置为完全透明?

4

1 回答 1

1

问题在于这一行:

originalImage.opacity(TransparentOpacity / 2);

源“test-Image-1.png”有一个 alpha 通道,看起来像......

原始 Alpha 通道

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

50% 阿尔法通道

有很多方法可以改变 Alpha 通道以降低图像不透明度。像素迭代FX级别颜色等等。我喜欢隔离 Alpha 通道、更改级别以及将通道恢复为图像。下面的示例只是将颜色值“交换”为 50% opacity == 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 );

不透明度降低 50%

现在您可以合成另一个图像,而不必担心黑色背景。

于 2015-06-02T19:39:51.070 回答