PHP: полутоновые jpgs, gifs, pngs ... также с альфа-каналами? - PullRequest
1 голос
/ 29 января 2010

$ im = ImageCreateFromString (file_get_contents ($ source_file)); ImageFilter ($ im, IMG_FILTER_GRAYSCALE);

Есть идеи, что я могу сделать, чтобы правильно gifs и pngs в градациях серого с прозрачностью? Этот фрагмент на самом деле работает хорошо, он преобразовывает jpgs и pngs в оттенки серого. Однако картинки немного «глючат» - они не всегда работают, это зависит от изображения. Иногда в них остается несколько бледных цветов. Более того, этот фрагмент не работает с альфа-каналами. Если я конвертирую gif или png с прозрачностью, прозрачные части всегда становятся черными.

Конечно, я запрашиваю тип изображения, и после "оттенков серого" я снова установлю правильный тип.

У вас есть идеи?

Ответы [ 2 ]

3 голосов
/ 29 января 2010

Этот код должен сохранять альфа, но он медленнее, чем imagefilter:

$im = ImageCreateFromString(file_get_contents($source_file));

$width=imagesx();
$height=imagesy();
for($x=0;$x<$width;$x++)
 for($y=0;$y<$height;$y++)
 {
  $rgb=imagecolorsforindex($im,imagecolorat($im,$x,$y));
  $average=ceil(($rgb["red"]+$rgb["green"]+$rgb["blue"])/3);
  imagesetpixel($im,$x,$y,imagecolorallocatealpha($im,$average,$average,$average,$rgb['alpha']));
 }

Если у вас все еще есть проблемы, попробуйте написать это после создания образа (до $ width = ..):

imagesavealpha($im,true);
2 голосов
/ 20 августа 2012

Для pngs простой вызов imagesavealpha () решает проблему черных пикселей на альфа-канале, полный код:

$im = ImageCreateFromString(file_get_contents($source))    
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagesavealpha($im,true);
imagepng( $im, $output );
...