Преобразование прозрачного «gif» в оттенки серого при сохранении прозрачности - PullRequest
0 голосов
/ 11 ноября 2011

Сначала я изменяю размер изображения при сохранении прозрачности:

/*
all the classic routine etcetera: 
$canvas = imagecreatefrom[png|gif|jpeg]();
$resize = imagecreatetruecolor();
*/

if($blending){
    $transparentIndex = imagecolortransparent($canvas);
    if($transparentIndex >= 0){
        #GIF
        imagepalettecopy($canvas, $resize);
        imagefill($resize, 0, 0, $transparentIndex);
        imagecolortransparent($resize, $transparentIndex);
        imagetruecolortopalette($resize, true, 256);
    }else{
        #PNG
        imagealphablending($resize, false);
        imagesavealpha($resize, true);                          
        $transparent = imagecolorallocatealpha($resize, 255, 255, 255, 127); 
        imagefill($resize, 0, 0, $transparent); 
    }
}

imagecopyresampled($resize, $canvas, 0, 0, 0, 0, $nx, $ny, $x, $y);

// image[png|gif|jpeg]... (image gets saved)

Затем я хочу применить фильтр оттенков серого к ранее сохраненному изображению (в новой функции):

/*
classic routine again: 
$canvas = imagecreatefrom[png|gif|jpeg]()
*/

if($blending){          
    imagealphablending($canvas, false);
    imagesavealpha($canvas, true);
}

imagefilter($canvas, IMG_FILTER_GRAYSCALE);

/*
This fully filters PNG's to Grayscale while saving transparency,
but for GIF, black background is added to my grayscaled picture,
plus, the picture isn't fully grayscale (more like gets high-contrasted with acidic colors).
*/

// image[png|gif|jpeg]

Какое было бы исправление, чтобы сохранить прозрачность при применении IMG_FILTER_GRAYSCALE к gif?

Что было бы исправлением, чтобы преобразовать gif в оттенки серого при сохранении прозрачности?(Вопрос пересмотрен из-за ответа, предоставленного @Pierre)

Заранее спасибо!

1 Ответ

2 голосов
/ 11 ноября 2011

Фильтр изображений, используемый с фильтром серой шкалы, позаботится об альфа-канале.

Однако gif не поддерживает альфа-канал.Поэтому вы не сможете сохранить его в формате GIF.

Важно также отметить, что цвет фона (один единственный цвет или индекс цвета, используемый в качестве фона) не имеет ничего общего с альфа-каналом.(уровень прозрачности данного цвета или пикселя).Это означает, что вы несете ответственность за установку цвета фона на желаемый один цвет.

Обновление

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

Обходной путь может быть таким:


$logo = imagecreatefromgif('php.gif');


$newimg = imagecreatetruecolor(imagesx($logo), imagesy($logo));
/* copy ignore the transparent color
 * so that we can use black (0,0,0) as transparent, which is what 
 * the image is filled with when created.
 */
$transparent = imagecolorallocate($newimg, 0,0,0);

imagecolortransparent($newimg, $transparent);
imagecopy($newimg, $logo, 0,0, 0, 0,imagesx($logo), imagesx($logo));
imagefilter($newimg, IMG_FILTER_GRAYSCALE);
imagegif($newimg, 'a.gif');

этот код просто извлекает значение существующего прозрачного цвета, преобразует его в серый и возвращает его в индекс цвета.Этот код будет работать только для изображения палитры, как GIF, но это идея.

...