PHP / GD:如何处理jpg透明度?

时间:2019-01-04 19:22:50

标签: php jpeg transparency gd

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");

3 个答案:

答案 0 :(得分:1)

在几乎所有情况下,您都可以将左上角的像素颜色用作透明颜色。

答案 1 :(得分:0)

您可以给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

这是它的工作方式:

  1. 在整个图像周围添加白色边框
  2. 从左上角开始通过透明填充白色(和所有与之相似的颜色(均为1%))
  3. 删除图像周围的多余边框
  4. 在整个图像周围添加黑色边框
  5. 从左上角开始通过透明填充黑色(和所有与黑色相似的颜色1%)
  6. 删除图像周围的多余边框
  7. 将结果图像写入文件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

它将从输入图像中删除所有“空白”。

答案 2 :(得分:0)

我不确定您在问什么。您是从具有透明性的非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”并将其附近的颜色更改为“黑色”的百分比。

对不起,我不知道GD。但我希望它具有类似的功能。或者,您可以使用基于Imagemagick构建的PHP Imagick。