PHP, GD и прозрачность GIF
При изменении размера GIF изображений в PHP с помощью библиотеки GD, цвет прозрачности заменяется на черный. Это не баг, это жизнь, но исправить это можно :) Для этого надо определить индекс цвета прозрачности у исходного изображения, и вставить его в палитру нового, уменьшенного, изображения. Код который это делает приведен ниже, сразу после него можно выполнять знакомый ImageCopyResampled($dst_image, $src_image, ...)
PHP:
-
//Begin Transparent Color Resize Correction for Gif and 8bit Png, by Martin Schmidt
-
$colorcount = imagecolorstotal($src_image);
-
imagetruecolortopalette($dst_image,true,$colorcount);
-
imagepalettecopy($dst_image,$src_image);
-
$transparentcolor = imagecolortransparent($src_image);
-
imagecolortransparent($dst_image,$transparentcolor);
-
//End Transparent Color Resize Correction
Правда получившаяся картинка будет выглядеть достаточно грубо, поэтому в будущем, надеюсь, попадётся в сети решения для более качественной обработки.


October 16th, 2008 at 11:49 Quote
Для gif это помогает, а для png не катит - там черный фон остается.
October 16th, 2008 at 12:04 Quote
Буквально на прошлой неделе возился с ватермарками, и деиствительно с 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');
}
}
October 16th, 2008 at 13:30 Quote
Да и на другом сайте нашел, что для ПНГ надо юзать эти 2 функции
imageAlphaBlending($logoim, false);
imageSaveAlpha($logoim, true);
October 22nd, 2008 at 14:17 Quote
Да и не для всех гифок этот вариант прокатывет.