This Might Be Useful

PHP, GD и прозрачность GIF

При изменении размера GIF изображений в PHP с помощью библиотеки GD, цвет прозрачности заменяется на черный. Это не баг, это жизнь, но исправить это можно :) Для этого надо определить индекс цвета прозрачности у исходного изображения, и вставить его в палитру нового, уменьшенного, изображения. Код который это делает приведен ниже, сразу после него можно выполнять знакомый ImageCopyResampled($dst_image, $src_image, ...)

PHP:
  1. //Begin Transparent Color Resize Correction for Gif and 8bit Png, by Martin Schmidt
  2. $dst_image = imagecreatetruecolor( $width, $height );
  3. $colorcount = imagecolorstotal($src_image);
  4. imagetruecolortopalette($dst_image,true,$colorcount);
  5. imagepalettecopy($dst_image,$src_image);
  6. $transparentcolor = imagecolortransparent($src_image);
  7. imagefill($dst_image,0,0,$transparentcolor);
  8. imagecolortransparent($dst_image,$transparentcolor);
  9. //End Transparent Color Resize Correction

Правда получившаяся картинка будет выглядеть достаточно грубо, поэтому в будущем, надеюсь, попадётся в сети решения для более качественной обработки.

автор кода

· Отключаем нежелательные HTML-элементы с помощью CSS
· Valid XHTML Flash SWF Objects embedding (updated)
· Поддержка прозрачности PNG в IE6

- Коментировать
- Trackback

4 Responses to “PHP, GD и прозрачность GIF”


  1. illusions Says:

    Для gif это помогает, а для png не катит - там черный фон остается.

  2. d3 Says:

    Буквально на прошлой неделе возился с ватермарками, и деиствительно с png надо работать по другому, вот например как тут:
    (наверно вся разметка съедет, ну ниче %)

    public function watermarkImagePNG($srcim, $logoim, $return='resource') {
    if (!$srcim) die(__FUNCTION__.': watermark could not be created 1');
    if (!$logoim) die(__FUNCTION__.': watermark could not be created 2');

    $src_w = imagesx($srcim);
    $src_h = imagesy($srcim);

    $logo_w = imagesx($logoim);
    $logo_h = imagesy($logoim);

    imageAlphaBlending($logoim, false);
    imageSaveAlpha($logoim, true);

    imagecopy($srcim, $logoim, $src_w/2-$logo_w/2, $src_h/2-$logo_h/2, 0, 0,
    $logo_w, $logo_h);

    if ($return=='resource') {
    return $srcim;
    }
    elseif ($return=='output') {
    return imagejpeg($srcim);
    }
    else {
    die(__FUNCTION__.': unknown output type');
    }
    }

  3. illusions Says:

    Да и на другом сайте нашел, что для ПНГ надо юзать эти 2 функции
    imageAlphaBlending($logoim, false);
    imageSaveAlpha($logoim, true);

  4. illusions Says:

    Да и не для всех гифок этот вариант прокатывет.

Leave a Reply

code