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

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

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

【问题讨论】:

标签: php png jpeg


【解决方案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 就足够了吗?
              猜你喜欢
              • 1970-01-01
              • 2021-06-18
              • 2012-08-13
              • 2011-09-30
              • 1970-01-01
              • 2010-11-04
              • 2013-12-29
              • 2013-05-10
              • 2011-10-28
              相关资源
              最近更新 更多