使用 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 以及 imagecreatefrompng
和 imagejpeg
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_limit
、max_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 并删除背景作品但并不完美
liip_imagine 是不是将 jpeg/jpg/png 文件转换为 webp? - symfony php 7.4.9