如何在PHP中优化图像?

时间:2011-07-13 12:02:07

标签: php image-processing imagemagick gd

我有一个网站,用户可以保存他们的个人资料图片(头像)。

我想在加载图像时对图像进行一些优化。

我的意思是,它是一个头像,不需要全分辨率,也不需要很大的尺寸。

我该怎么办?我一直在想:

  • 调整大小
  • 质量低劣

可能的:

  • 将其转换为GIF
  • 颜色填充到透明PNG

有一些库比GD更好(更简单)吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

GD就是这样做的。这听起来像一个简单的操作,但是如果你要这样做,你真的想要做出许多因素。总而言之,这需要数百行代码来处理所有事情。

我的建议是,尽管您可能希望调整图像大小(如果使用JPEG需要进行有损的重新压缩),将其转换为GIF是一个坏主意。你不知道源类型是什么,所以这样做是有问题的。

这是我推荐的流程:

1)将图像大小调整为输出格式。如果需要,您也可以在此处强制裁剪宽高比。

2)确定原始来源模式:

  • 8位索引(GIF / PNG8):另存为PNG8(格式往往小于GIF)。
  • 16-24位:另存为JPG。质量取决于您,但70%是一个很好的基准。
  • 32位(PNG24):另存为PNG24,注意保持透明度。

请注意,这个解决方案几乎会破坏任何“动画”的GIF,但是...当你尝试调整动画gif的大小时会发生这种情况。

虽然......我也强烈建议不要将其作为单个阶段进程并删除原始文件。这种东西只会在以后再次咬你。

目前磁盘空间很便宜......以高质量格式(即使是2K x 2K分辨率)存储原件要好得多,然后创建一个图像服务,它将提供您所需的分辨率/质量并缓存结果

答案 1 :(得分:1)

您可以使用Asido imaging library for PHP调整图片大小。这个库虽然使用了GD。这是一些example usage code

调整大小和其他成像操作最好在上传新图像后进行(除非您想为其他目的保存更高的分辨率)。

答案 2 :(得分:0)

我会为您的网页选择一些标准的头像图片尺寸,例如

  • 个人资料页面的中等大小,如果你有一个和
  • 小尺寸显示在用户帖子旁边
  • 你明白了,只需要你想要的东西

当用户上传新的头像时,您可以使用合理的质量设置将其转换为您需要的格式。我假设你要使用JPEG,因为这是这个用例的一个很好的全能格式。 PNG在摄影内容方面表现不佳,但JPEG对于绘图并不是很好,但是你看到的大多数头像都是照片。这些天我不再使用GIF了,它们限制为256种颜色并且只有1位alpha通道。

答案 3 :(得分:0)

<p>
//This function will proportionally resize image 
function resizeImage($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType)
{
//Check Image size is not 0
if($CurWidth <= 0 || $CurHeight <= 0) 
{
return false;
}   
//Construct a proportional size of new image
$ImageScale         = min($MaxSize/$CurWidth, $MaxSize/$CurHeight); 
$NewWidth           = ceil($ImageScale*$CurWidth);
$NewHeight          = ceil($ImageScale*$CurHeight);
$NewCanves          = imagecreatetruecolor($NewWidth, $NewHeight);
// Resize Image
if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $NewWidth, $NewHeight, $CurWidth, $CurHeight))
{
switch(strtolower($ImageType))
{
case 'image/png':
imagepng($NewCanves,$DestFolder);
break;
case 'image/gif':
imagegif($NewCanves,$DestFolder);
break;          
case 'image/jpeg':
case 'image/pjpeg':
imagejpeg($NewCanves,$DestFolder,$Quality);
break;
default:
return false;
}
//Destroy image, frees memory   
if(is_resource($NewCanves)) {imagedestroy($NewCanves);} 
return true;
}
}
</p>