Вопрос

Я использую 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. Когда вы устанавливаете его в ложь, он выбирает по умолчанию для 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top