6

画像ギャラリーを作成しようとしています。今回はPHP Image Magickでやってみたいと思います。

ファイルをアップロードするときに、サイズを 1024x724 に変更したいと考えています。画像が垂直(幅<高さ)の場合、画像の中央に合わせて、空白にする必要がある両側の透明な背景(または不可能な場合は白)に合わせたいので、画像は常に1024x724でアスペクト保管するラジオ。

画像が水平 ( width > height ) の場合も同様です。

これまでの私のコードは次のとおりです。

$img = new Imagick($targetFile);
$img->scaleImage(1024,724);
$img->setGravity(imagick::GRAVITY_CENTER);
$img->setImageBackgroundColor('white');
$img->extentImage(1024,724,0,0);

$img->writeImage($targetFile);

$img = new Imagick($targetFile);
$img->scaleImage(150,150);
$img->setGravity(imagick::GRAVITY_CENTER);
$img->setImageBackgroundColor('white');
$img->extentImage(150,150,0,0);

$img->writeImage($targetThumb);
4

1 に答える 1

12

あなたが何を望んでいるかを私が正しく理解しているなら、あなたはすでに途中まで進んでいます。現在、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 の好意による

于 2013-03-03T04:38:25.800 に答える