2009-06-22 21 views
3

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

です。しかし、もし私がそれを行うと、すべての透明領域が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); 

私はこのテーマについて私に教えてもらえますか?

+0

大変申し訳ございません。 JPEG形式のAfaik画像は、その点で「透明」な背景やアルファチャンネルを持つことはできません。 – merkuro

+0

ええ、私はそれを知っています。私は元のPNG画像のすべての透過領域をJPEG出力で白に変換したいだけです。申し訳ありませんが私は十分に自分自身を説明していない場合。 –

答えて

6

おそらくあなたのPNGによって異なります。 PNGファイルには背景色を含めることができ、透明が機能しないときに使用できます。 PNGにはおそらく白い背景があります。 imageaplhablendingをtrueに設定すると、PNGの背景色がピックアップされ、JPEGを書き込むときにその色が使用されます。 falseに設定すると、黒のGDのデフォルトが選択されます。

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

ちなみに、PNGの背景色のトリックは、IE6の画像にとって素晴らしいものです。 IE6は透明なPNGをサポートしていないので、保存した背景色を表示します。透明なPNGを保存するときは、ウェブサイトと同じ背景色で保存します。それは、IE6のPNG画像の周りの白または黒のボックスよりも見栄えが良いでしょう。

3

あなたはJPGにPNG(またはGIF)から変換する場合、あなたはおそらく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; 
} 

希望は役立ちます。

+0

imagealphablending($ bg、TRUE)にコメントする。私はIMG_COLOR_TRANSPARENT定数でやっていることとほとんど同じです。私の主な疑問は、ImageAlphaBlendingとImageSaveAlphaを同時に使用することです。どちらもtrueに設定されています。それが正しい結果を得られる唯一の方法ですが、マニュアルでは間違っていると言いますが、同時に両方を真実にすることはできません。 –

+0

あなたのコードが何をしているのか分かりませんが、上記のコードは私のために働いていました。 – shadowhand

関連する問題