PHP / GD ImageSaveAlpha и ImageAlphaBlending

Я использую 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 имеет белый фон. Когда вы устанавливаете значение true для изображения, оно выбирает цвет фона из вашего PNG и использует это при записи JPEG. Когда вы установите его на false, он выбирает значение по умолчанию для GD, которое является черным.

Вы можете попробовать это для себя. Создайте прозрачный PNG и сохраните его с оранжевым или розовым фоном. Второй пример должен показать этот цвет.

Кстати, трюк фонового цвета PNG хорош для изображений IE6. IE6 не поддерживает прозрачные PNG, поэтому отображает их с любым цветом фона, с которым вы их сохранили. При сохранении прозрачных PNG сохраните их с тем же цветом фона, что и ваш веб-сайт. Он будет выглядеть лучше, чем белые или черные квадратики вокруг ваших изображений PNG в IE6.

Если вы конвертируете 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; } 

Надеюсь, это поможет.