使用 PHP 将 PNG 转换为 JPG 并进行压缩?

Posted

技术标签:

【中文标题】使用 PHP 将 PNG 转换为 JPG 并进行压缩?【英文标题】:Use PHP to convert PNG to JPG with compression? 【发布时间】:2010-11-15 03:59:38 【问题描述】:

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

PHP 有执行此操作的函数/库吗?质量/压缩效果好吗?

【问题讨论】:

请注意,根据图像的不同,JPG 的文件大小并不总是比 PNG 小,因此请确保使用适合您情况的文件。 lbrandy.com/blog/2008/10/my-first-and-last-webcomic 【参考方案1】:

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

【讨论】:

【参考方案2】:

您可能想查看Image Magick,它通常被认为是图像处理的事实标准库。确实需要安装一个额外的 php 模块,但不确定默认安装中是否有/哪些可用。

HTH。

【讨论】:

【参考方案3】:

请注意要转换的内容。 JPG 不支持 alpha 透明度,而 PNG 支持。您将丢失该信息。

要转换,你可以使用以下函数:

// 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() 函数。

【讨论】:

请查看 danLeon 的答案以安全地将 PNG 转换为 JPG。【参考方案4】:

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

【讨论】:

【参考方案5】:

这是一个小示例,它将以 70% 的图像质量将“image.png”转换为“image.jpg”:

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

希望有帮助

【讨论】:

【参考方案6】:

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

您真的需要在 PHP 中执行此操作吗? 我的意思是:如果您需要转换大量图像,那么在 PHP 中进行可能不是最好的方法:您将遇到memory_limitmax_execution_time、...

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

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

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

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

作为旁注:如果您直接在生产服务器上执行此操作,您可以在转换之间放置一些睡眠时间,有时让它冷却一点^^

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

【讨论】:

【参考方案7】:
<?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(即 100 像素)。

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

【讨论】:

【参考方案8】:

这样做可以安全地将 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);

【讨论】:

这好多了,处理透明度。两个最佳答案现在是水平挂钩! 你让我的一天变得更好了,伙计!谢谢! 此代码是否适用于其他类型的源文件,例如 bmp? 我知道这是一个老问题,但是是什么使它成为将 PNG 转换为 JPG 的最正确方法?这不是更简单的answer 就足够了吗?

以上是关于使用 PHP 将 PNG 转换为 JPG 并进行压缩?的主要内容,如果未能解决你的问题,请参考以下文章

PHP Imagick 将 JPG 转换为 PNG 并删除背景作品但并不完美

在 PHP 中将 JPG/GIF 图像转换为 PNG?

liip_imagine 是不是将 jpeg/jpg/png 文件转换为 webp? - symfony php 7.4.9

将 .jpg 图像转换为 .png

使用 imagecreatefromstring() 时 PHP 将图像导出为相同类型(PNG、JPG 等)

PHP:将 png 和 gif 转换为灰度