3

我正在开发一个程序,以使用Image::Magick为产品图像动态添加水印。我正在使用compositedissolve方法。水印图像是具有透明度的 PNG。它在 Linux 上运行,带有ImageMagick 6.7.6-9 2012-05-16 Q16.

考虑以下任意示例图像:

背景(test.jpg):

背景(产品图片)

水印/覆盖 ( example.png):

示例水印

如果我将这些与命令行工具放在一起composite,一切都很好。

composite -dissolve 60% -gravity center example.png test.jpg out.jpg

CLI 的正确输出

文本(这需要是图像,其中也将包含图形)叠加在背景上。边缘就是它们在原始水印图像中的样子。

#!/usr/bin/perl
use strict; use warnings;
use Image::Magick;

# this objects represents the background
my $background = Image::Magick->new;
$background ->ReadImage( 'test.jpg' );

# this objects represents the watermark
my $watermark = Image::Magick->new;
$watermark->ReadImage( 'example.png');

# there is some scaling going on here...
# both images are scaled down to have the same width
# but the problem occurs even if I turn the scaling off

# superimpose the watermark
$background->Composite(
  image    => $watermark,
  compose  => 'Dissolve',
  opacity  => '60%',
  gravity  => 'Center',
);

$background->Write( filename => 'out.jpg' );

这是这个 Perl 程序的输出:

Perl 程序的奇怪输出

如您所见,新图像有一些奇怪的边缘,几乎就像一个轮廓。该图像越大(原始源图像都> 1000px),该轮廓变得越明显。

这是一个特写:

正确图像的特写

错误图像的特写

我相信这可能与 JPEG 压缩的强度有关,因为错误的图像有更多的伪像。但这意味着 Perl 的 Image::Magick 和 CLI 的默认值是不同的。我还没有弄清楚如何设置压缩。

无论如何,我很高兴收到任何关于为什么会发生这种情况的意见,或者关于如何摆脱它的想法和建议。

4

1 回答 1

1

我快速浏览了 PerlMagick 源代码,当溶解的图像具有 alpha 通道时,似乎Composite有问题。Dissolve以下对我有用:

$watermark->Evaluate(
  operator => 'Multiply',
  value    => 0.6,
  channel  => 'Alpha',
);

$background->Composite(
  image    => $watermark,
  gravity  => 'Center',
);
于 2013-02-04T17:47:08.420 回答