PHP / GD imagesavealpha ve imagealphablending

2 Cevap php

Ben JPEG adlı saydam PNG en dönüştürürken ancak benim testleri sırasında ben bir garip davranışı bulundu, görüntüleri yeniden boyutlandırmak ve dönüştürmek için GD kullanıyorum. Manuel ImageAlphaBlending () varsayılan olarak ama ben ImageSaveAlpha () (sırayla ben imagealphablending ayarlamanızı gerektirir ki (true) ayarlamanız gerekir şeffaflığı korumak amacıyla açık göre false). Yani doğru yolu olmalıdır:

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

Ben bunu "doğru" şekilde yaparsanız Ancak tüm saydamlık alan JPEG siyah gelir. Bu benim testleri (şeffaf alanlar üzerinde beyaz arka plan ile JPEG) iş gibi görünüyor:

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

Birisi bu konuda beni aydınlatabilir misiniz?

2 Cevap

Muhtemelen sizin PNG bağlıdır. Bir PNG dosyası şeffaflık işe yaramazsa ne zaman kullanılabilecek bir arka plan rengi içerebilir. PNG muhtemelen beyaz bir arka plan vardır. True imageaplhablending ayarladığınızda bu PNG arka plan rengini alır ve kullanır JPEG yazarken. False ayarlamak zaman siyah GD için varsayılan seçer.

Kendiniz için bunu deneyebilirsiniz. Şeffaf PNG oluşturmak ve bir portakal veya pembe arka plan rengi ile kaydedin. Sizin ikinci bir örnek bu rengi göstermelidir.

Bu arada, PNG arkaplan rengi hile IE6 görüntüler için güzel bir tanesidir. Eğer onları kurtardı olursa olsun arka plan rengi ile bunları görüntüler böylece IE6 şeffaf PNG desteklemiyor. Şeffaf PNG kaydederken, web sitenizin aynı arka plan rengi ile bunları kaydedin. Bu IE6 PNG görüntüleri etrafında beyaz veya siyah kutular daha iyi bakacağız.

Eğer JPG, PNG (veya GIF) dönüştürme yapıyorsanız, muhtemelen imagecopy ($image zaten oluşturulmuş herhangi bir görüntü kullanarak, beyaz dolu başka bir görüntüye son görüntüyü kopyalamak gerekir GD ile):

// 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;
}

Umut olur.