11

PNGのサイズを変更するときにアルファを正しく管理する方法をすべて調べました。透明性を維持することができましたが、完全に透明なピクセルに対してのみです。これが私のコードです:

$src_image = imagecreatefrompng($file_dir.$this->file_name);
$dst_image = imagecreatetruecolor($this->new_image_width, $this->new_image_height);
imagealphablending($dst_image, true);
imagesavealpha($dst_image, true);
$black = imagecolorallocate($dst_image, 0, 0, 0);
imagecolortransparent($dst_image, $black);
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $this->new_image_width, 
                 $this->new_image_height, $this->image_width, $this->image_height);
imagepng($dst_image, $file_dir.$this->file_name);

このソース イメージから始めます。

ここに画像の説明を入力

リサイズされた画像は次のようになります。

ここに画像の説明を入力

この問題について私が見たほとんどすべてのフォーラム投稿の解決策は、次のようにすることです。

imagealphablending($dst_image, false);
$transparent = imagecolorallocatealpha($dst_image, 0, 0, 0, 127);
imagefill($dst_image, 0, 0, $transparent);

このコードの結果は、アルファの保存に失敗します。

ここに画像の説明を入力

他の解決策はありますか?アルファブレンディングで何か不足していますか? なぜそれが他の人にはうまくいくのに、私にはまったく失敗するのでしょうか? MAMP 2.1.3 と PHP 5.3.15 を使用しています。

4

2 に答える 2

11
"They have not worked at all and I'm not sure why."

まあ、あなたは何か悪いことをしていたに違いありません。画像をロードして保存するために数行追加された、リンクされた複製のコード:

$im = imagecreatefrompng(PATH_TO_ROOT."var/tmp/7Nsft.png");

$srcWidth = imagesx($im);
$srcHeight = imagesy($im);

$nWidth = intval($srcWidth / 4);
$nHeight = intval($srcHeight /4);

$newImg = imagecreatetruecolor($nWidth, $nHeight);
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight,
    $srcWidth, $srcHeight);

imagepng($newImg, PATH_TO_ROOT."var/tmp/newTest.png");

画像を生成します:

透明度のあるサイズ変更された PNG

つまり、この質問 (および回答) は完全に重複しています。

于 2013-06-18T22:01:02.887 に答える
-2

画像のサイズ変更に simpleImage クラスを使用しました。アスペクト比を維持したまま、画像のサイズを変更できます。このクラスは、imagecreatetruecolor およびimagecopyresampledコア Php 関数を使用して画像のサイズを変更しています

  $new_image = imagecreatetruecolor($width, $height);
  imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
  $this->image = $new_image;

http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/で完全なコードを見つけてください。

于 2013-06-07T06:58:09.297 に答える