質問

画像のサイズ変更と変換にGDを使用していますが、テスト中に透明なPNGをJPEGに変換するときに奇妙な動作を発見しました。マニュアルによると、 ImageAlphaBlending ()はデフォルトでオンになっていますが、透明性を維持するために ImageSaveAlpha ()をtrueに設定します(これにより、ImageAlphaBlending()をfalseに設定する必要があります)。正しい方法は次のとおりです。

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, false);
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);

ただし、それを行うと、「正しい」 JPEGではすべての透明領域が黒くなります。これは私のテストで動作するようです(透明な領域に白い背景を持つJPEG):

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, true); // true by default, but still...
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);

この件について誰かに教えてもらえますか?

役に立ちましたか?

解決

おそらくPNGに依存します。 PNGファイルには背景色を含めることができます。これは、透明度が機能しない場合に使用できます。 PNGの背景はおそらく白です。 imageaplhablendingをtrueに設定すると、PNGから背景色が取得され、JPEGの書き込み時にそれが使用されます。 falseに設定すると、GDのデフォルトである黒が選択されます。

自分で試すことができます。透明なPNGを作成し、オレンジまたはピンクの背景色で保存します。 2番目の例では、その色が表示されます。

ところで、PNGの背景色のトリックはIE6画像に適しています。 IE6は透明なPNGをサポートしていないため、保存した背景色で表示されます。透明なPNGを保存するときは、Webサイトと同じ背景色で保存してください。 IE6のPNG画像の周りの白いボックスまたは黒いボックスよりも見た目がよくなります。

他のヒント

PNG(またはGIF)からJPGに変換する場合、おそらく imagecopy $ image はGDで既に作成された画像です):

// Create a new background
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));

// Allocate the color
$color = imagecolorallocate($bg, 255, 255, 255);

// Fill the background with white
imagefill($bg, 0, 0, $color);

// Alpha blending must be enabled on the background!
imagealphablending($bg, TRUE);

// Copy the current image onto the opaque background
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)))
{
    // Replace the image with the background copy
    imagedestroy($image);
    $image = $bg;
}

役立つこと。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top