[英]PHP/GD: How to handle jpg transparency?
JPG不支持透明度。
但是,您可以从GIMP等导出具有透明区域的图像。 在这种情况下,透明区域将在您的浏览器,Windows资源管理器或其他软件中显示为黑色或白色。
我经常收到需要处理并以几种较小格式提供的此类文件。 我通过使用GD库的一些PHP脚本来做到这一点。 问题在于,这些区域在处理后的版本中会变成黑色还是白色,这是无法预测的。 即使是白色背景也可能变成黑色。
所以我的问题是,是否可以某种方式检测到GD中的“透明”区域并为其指定特定的颜色。
例如,请参见这两张图片: http : //www.bilbil.com/9156-thickbox_default/bus.jpg http://bilbil.com/img/p/9/1/5/6/9156.jpg
目前,我使用以下代码:
$srcfile = "9158.jpg";
$dir ="/test/";
list($width, $height, $imgtype, $attr) = @getimagesize( $dir.$srcfile );
$src = imagecreatefromjpeg($dir.$srcfile);
$newheight=$newwidth = 800;
$img = imagecreatetruecolor ( $newwidth , $newheight );
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
imagecopyresampled($img, $src, ($newwidth-$width)/2, ($newheight-$height)/2, 0, 0, $width, $height, $width, $height);
if(!imagejpeg($img, $dir.'test.jpg', 97))
echo("Error creating testimage");
在几乎所有情况下,都可以使用左上角的像素颜色作为透明颜色。
您可以给ImageMagick一个机会。 以下命令将.jpeg文件透明地转换为.png。
convert bus.jpg \
-alpha set -fill none -fuzz 1% \
-bordercolor white -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
-bordercolor black -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
a.png
下面是它的工作原理:
a.png
这是PHP的代码段:
<?php
function jpg_to_png($jpg, $png)
{
$templ = trim("
convert {{jpg}} \
-alpha set -fill none -fuzz 1% \
-bordercolor white -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
-bordercolor black -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
{{png}}
");
$cmd = strtr($templ, [
'{{jpg}}' => escapeshellarg($jpg),
'{{png}}' => escapeshellarg($png)
]);
exec($cmd, $stdout, $exitcode);
if ($exitcode) {
throw new Error("Command failed with code $exitcode");
}
}
jpg_to_png('bus.jpg', 'a.png');
以下命令( ref )在您的情况下也可能会有所帮助:
convert bus.jpg -fuzz 1% -trim +repage a.jpg
它将从输入图像中删除所有“空白”。
我不确定你在问什么。 您是从具有透明性的非JPG图像开始并转换为JPG吗? 或者您已经有JPG。
如果您是从PNG或TIFF之类的透明图像开始,并且想要转换为JPG并始终具有黑色(或任何其他颜色)背景,那么在Imagemagick中 ,您可以执行以下操作:
convert image.png -background black -alpha background -alpha off image.jpg
要么
convert image.png -background black -flatten image.jpg
将黑色替换为您希望透明的任何其他颜色,例如白色。
如果您已经有某种颜色的JPG并将其更改为黑色,请执行以下操作:
convert image.jpg -fuzz XX% -fill black -opaque somecolor image.jpg
其中XX%是您要考虑接近“ somecolor”的百分比,要将该百分比更改为“ somecolor”和附近的颜色为黑色。
抱歉,我不知道GD。 但我希望它具有类似的功能。 或者,您可以使用基于Imagemagick构建的PHP Imagick。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.