3

Image::Magickを使用して製品画像に透かしを動的に追加するプログラムに取り組んでいます。メソッドで使用compositeしていdissolveます。透かし画像は、透明度のある 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のソースコードをざっと見てみましたが、ディゾルブされた画像にアルファチャネルがある場合、Compositewithはバグがあるようです。Dissolve以下は私のために働きます:

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

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