2

Image Magick の Perl モジュールであるPerl Magickを使用して、画像を GIF および PNG から JPEG に変換しています。背景が透明な画像を変換しようとするまで、すべてが完全に機能します。

Resize() 関数のデフォルトの動作は、変換しようとしている画像を台無しにする黒を使用することです。代わりに、デフォルトの背景色を白に変更したいのですが、その方法がわかりません。

コマンドラインで Image Magick を使用する場合、以下を使用して背景を変更できます。

convert image.gif -background \#FFFFFF -flatten image.jpg

そして、画像のサイズ変更と変換に使用しているperlコードは次のとおりです。

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Resize(geometry=>'500x');
$image->Write("output.jpg");

私はそれを機能させるために次のことを試みましたが、役に立ちませんでした:

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Set(background => 'white'); 
$image->Flatten();
$image->Resize(geometry=>'500x');
$image->Write("output.jpg");

また:

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Resize(geometry=>'500x',background=>'white');
$image->Write("output.jpg");

Perl Magick Resize() メソッドのデフォルトの背景色を正常に設定する方法を理解するための助けをいただければ幸いです。よろしくお願いします。

4

3 に答える 3

4

透明な領域を白に変換する最も簡単な方法は、サイズを変更する前に、白い背景の上に画像を貼り付けることだと思います。

use Image::Magick;

sub dims {
    my ($image) = @_;
    return $image->Get('width') . 'x' . $image->Get('height');
}

# First grab the image to be mangled.
my $image = Image::Magick->new();
$image->Read('input.png');

# Then, create a white image with the same size.
my $bg = Image::Magick->new(size => dims($image));
$bg->Read('xc:#ffffff');

# And overlay the original on top of it to fill the transparent pixels
# with white.
$bg->Composite(compose => 'Over', image => $image);

# Finally, continue on as normal using $bg instead of $image.
$bg->Resize(geometry => '500x');
$bg->Write('output.jpg');

Graphics :: Magick(ImageMagickのより高速なフォーク)でこれをテストしましたが、 Image::Magickでも同じように機能するはずです。

私は過去に同様の画像マングリングを試みましたが、上記は私が思いついた最高のものでした。

于 2011-02-12T03:37:33.600 に答える
1

残念ながら、Resize() メソッドを使用して適切なパラメーターを渡して背景色を設定するだけのクリーンな方法でこれを機能させることはできませんでした。

代わりに、問題を解決するために私が行ったことは、最初にファイルを JPG 形式に変換してから、後でサイズを変更することです。これは、Image Magick のデフォルトの背景色が白であるため、変換中に背景が正しく設定され、Resize() メソッドが解釈を行うことなく単純に JPG 画像を使用するため機能します。

私の推定では理想的なソリューションではありませんが、確実に機能します。

于 2011-02-22T18:55:53.360 に答える
0

試しましたか

$image->Flatten(background => 'white'); 
于 2011-02-11T20:31:13.503 に答える