使用PHP通过压缩将PNG转换为JPG?

时间:2009-07-29 17:20:15

标签: php png jpeg

我有一堆高质量的PNG文件。我想使用PHP将它们转换为JPG,因为它的文件大小较小,同时保持了质量。我想在网上显示JPG文件。

PHP是否有功能/库来执行此操作?质量/压缩是否有益?

8 个答案:

答案 0 :(得分:159)

这样做可以将PNG安全地转换为JPG,透明度为白色。

$image = imagecreatefrompng($filePath);
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
imagealphablending($bg, TRUE);
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imagedestroy($image);
$quality = 50; // 0 = worst / smaller file, 100 = better / bigger file 
imagejpeg($bg, $filePath . ".jpg", $quality);
imagedestroy($bg);

答案 1 :(得分:58)

小心你要转换的内容。当PNG这样做时,JPG不支持alpha透明度。你将失去这些信息。

要转换,您可以使用以下功能:

// Quality is a number between 0 (best compression) and 100 (best quality)
function png2jpg($originalFile, $outputFile, $quality) {
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
}

此函数使用GD库中的imagecreatefrompng()imagejpeg()函数。

答案 2 :(得分:10)

这是一个小例子,将'image.png'转换为'image.jpg',图像质量达到70%:

<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70);
imagedestroy($image);
?>

希望有所帮助

答案 3 :(得分:10)

<?php
function createThumbnail($imageDirectory, $imageName, $thumbDirectory, $thumbWidth) {
    $explode = explode(".", $imageName);
    $filetype = $explode[1];

    if ($filetype == 'jpg') {
        $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName");
    } else
    if ($filetype == 'jpeg') {
        $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName");
    } else
    if ($filetype == 'png') {
        $srcImg = imagecreatefrompng("$imageDirectory/$imageName");
    } else
    if ($filetype == 'gif') {
        $srcImg = imagecreatefromgif("$imageDirectory/$imageName");
    }

    $origWidth = imagesx($srcImg);
    $origHeight = imagesy($srcImg);

    $ratio = $origWidth / $thumbWidth;
    $thumbHeight = $origHeight / $ratio;

    $thumbImg = imagecreatetruecolor($thumbWidth, $thumbHeight);
    imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $origWidth, $origHeight);

    if ($filetype == 'jpg') {
        imagejpeg($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'jpeg') {
        imagejpeg($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'png') {
        imagepng($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'gif') {
        imagegif($thumbImg, "$thumbDirectory/$imageName");
    }
}
    ?>

这是一个非常好的缩略图脚本=) 这是一个例子:

$ path =原始图片所在文件夹的路径。 $ name =要制作缩略图的文件的文件名。 $ thumbpath =要将缩略图保存到的目录的路径。 $ maxwidth = PX中缩略图的最大宽度,例如。 100(将是100px)。

createThumbnail($path, $name, $thumbpath, $maxwidth);

答案 4 :(得分:4)

您可能希望查看Image Magick,通常被认为是图像处理的事实标准库。是否需要安装额外的php模块,不确定是否在默认安装中可用。

HTH。

答案 5 :(得分:3)

PHP有一些image processing functions以及imagecreatefrompngimagejpeg function。第一个将创建PNG图像文件的内部表示,而第二个用于将该表示保存为JPEG图像文件。

答案 6 :(得分:2)

this list of php image libraries。基本上它是GD或Imagemagick。

答案 7 :(得分:2)

我知道这不是OP的确切答案,但已经给出了答案......

你真的需要在PHP中这样做吗?
我的意思是:如果你需要转换很多图像,用PHP做这可能不是最好的方法:你将遇到memory_limitmax_execution_time,...

我也会说GD可能无法为您提供最佳的质量/尺寸比率;但不确定(如果你在GD和其他解决方案之间进行比较,我对结果非常感兴趣;-))

另一种不使用PHP的方法是通过命令行使用Image Magick(而不像其他人建议的那样使用PHP扩展名)

您必须编写一个shell脚本,该脚本遍历所有.png个文件,并将它们提供给

  • convert为每个.jpg文件创建新的.png文件
  • mogrify直接处理原始文件并覆盖它。


作为旁注:如果您直接在生产服务器上执行此操作,则可以在一系列转换之间放置一些休眠时间,以便稍微冷却一下^^


我已经使用shell脚本+ convert / mogrify几次(让它们一次运行10个小时),他们做得非常好: - )