繁体   English   中英

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

[英]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

下面是它的工作原理:

  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

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

我不确定你在问什么。 您是从具有透明性的非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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM