1

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

知道我能做什么,以正确地灰度 gif 和 png 透明吗?这个片段实际上效果很好,它将 jpg 和 png 转换为灰度。但是 gif 有点“错误”——它们并不总是有效,这取决于图像。有时它们会留下一些苍白的颜色。此外,此代码段不适用于 alpha 通道。如果我转换具有透明度的 gif 或 png 透明部分总是变黑。

当然,我正在查询图像类型,在“灰度化”它之后,我会再次设置正确的类型。

你有什么想法吗?

4

2 回答 2

3

此代码应保留 alpha,但它比 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);
于 2010-01-29T16:03:12.857 回答
2

对于 pngs,对 imagesavealpha() 的简单调用解决了 alpha 通道上的黑色像素问题,完整代码:

$im = ImageCreateFromString(file_get_contents($source))    
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagesavealpha($im,true);
imagepng( $im, $output );
于 2012-08-20T07:30:05.817 回答