あなたが何を望んでいるかを私が正しく理解しているなら、あなたはすでに途中まで進んでいます。現在、jpeg の代わりに透過 PNG (ソースと宛先) を使用しようとすると、画像が平坦化され、背景が真っ白になりますが、これは正しくありませんか?
必要なことは、画像に透明度があるか、または透明度がある可能性があるかどうかを判断し、背景色を [なし] に設定することです。-extent
画像を平坦化するため、透明性を維持するには、そのような場合に背景が必要になりますNone
。(そして、前述のように、jpeg は透明度を処理できないため、もちろん、jpg ではなく png または gif 出力を使用する必要があります。) 通常、ほとんどの場合、それで十分なので、単純な拡張子チェックを行いますが、より詳細なチェックがあります。チェックします。
$background = preg_match('/\.gif$|\.png$/', $thumbnailFilename) == 1 ? 'None' : 'white';
$edge = shell_exec("convert $imgFile -resize 1024x724 -background $background -gravity center -extent 1024x724 -quality 90 $thumbnailFilename");
ここで出力サムネイルを確認します。ソースに関係なく jpeg に出力している場合は透明度が失われるからです。$imgFile
これにより、 test-transparent1.png および test-transparent1.sized.png として提供する場合$thumbnailFilename
、test-transparent1.sized.png は 1024x724 に収まるようにサイズ設定され、元の画像が中央に配置されるように透明ピクセルでパディングされます。
==ImageMagick PHP クラスの編集:==
まず、比例スケーリングを行うには、scaleImage の bestfit パラメータを true に設定する必要があります。さらに、API を使用する場合、extentImage は重力オプションをまったく使用しないように見えるため、負の X または Y オフセットを使用して、新しいキャンバスの画像を適切に中央に配置する必要があります。動作するようになった後のテスト スクリプトは次のようになります。
<?php
$targetFile = 'mizu.png';
$targetThumb = 'mizu.thumb.png';
$background = preg_match('/\.gif$|\.png$/', $targetThumb) == 1 ? 'None' : 'white';
$img = new Imagick($targetFile);
$img->scaleImage(150,150,true);
$img->setImageBackgroundColor($background);
$w = $img->getImageWidth();
$h = $img->getImageHeight();
$img->extentImage(150,150,($w-150)/2,($h-150)/2);
$img->writeImage($targetThumb);
== コメントごとに更新: ==
この回答にたどり着き、6.5.7-8 以降で imagemagick を使用している場合は、この回答を調整して、extentImage の x 値と y 値が負になるようにする必要があります。php.net/manual/en/imagick.extentimage.phpで注意事項を確認できます- Jeff Richards の好意による