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
テキスト (これは画像である必要があり、グラフィックスも含まれます) は背景の上に重ねられます。エッジは、元の透かし画像とまったく同じです。
#!/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 プログラムの出力は次のとおりです。
ご覧のとおり、新しい画像には輪郭のような奇妙なエッジがいくつかあります。この画像が大きくなるほど (元のソース画像は両方とも 1000px を超えます)、この輪郭がより明確になります。
ここにクローズアップがあります:
間違った画像にはより多くのアーティファクトがあるため、JPEG 圧縮の強度と関係があるのではないかと思います。しかし、それは Perl の Image::Magick と CLI のデフォルトが異なることを意味します。圧縮の設定方法がまだわかりません。
とにかく、なぜこれが起こるのか、またはそれを取り除く方法についてのアイデアや提案について、どんな種類の意見でもうれしいです.