PHP / GD ImageSaveAlpha и ImageAlphaBlending - PullRequest
3 голосов
/ 22 июня 2009

Я использую GD для изменения размера и преобразования изображений, однако во время тестов я обнаружил странное поведение при преобразовании прозрачных PNG в JPEG. Согласно инструкции ImageAlphaBlending () включен по умолчанию, но для сохранения прозрачности я должен установить для ImageSaveAlpha () значение true (что, в свою очередь, требует, чтобы я установил ImageAlphaBlending () ложный). Так что правильный путь должен быть:

$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);

Может кто-нибудь просветить меня по этому вопросу?

Ответы [ 2 ]

6 голосов
/ 22 июня 2009

Это, вероятно, зависит от вашего PNG. Файл PNG может содержать цвет фона, который можно использовать, когда прозрачность не работает. Ваш PNG, вероятно, имеет белый фон. Когда вы устанавливаете imageaplhablending в true, он выбирает цвет фона из вашего PNG и использует его при записи JPEG. Когда вы устанавливаете его в false, он выбирает значение по умолчанию для GD, которое является черным.

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

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

3 голосов
/ 16 июля 2009

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

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

...