如何在PHP中优化图像?

如何在PHP中优化图像?,php,image-processing,imagemagick,gd,Php,Image Processing,Imagemagick,Gd,我有一个网站,用户可以保存他们的个人资料图像(头像) 我想在加载图像时对其进行一些优化 我的意思是,它是一个化身图像,不需要全分辨率,也不需要很大的尺寸 我能做什么?我一直在想: 调整大小 降低质量 可能的: 将其转换为GIF格式 透明PNG的颜色填充 有一些比GD更好(更简单)的库可以做到这一点吗 非常感谢 我会为你的页面选择一些标准的头像图像大小,比如 中等大小的个人资料页,如果您有一个和 显示在用户帖子旁边的小尺寸 你有了这个想法,正是你需要的 当用户上传一个新的头像时,你可以

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

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

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

我能做什么?我一直在想:

  • 调整大小
  • 降低质量
可能的:

  • 将其转换为GIF格式
  • 透明PNG的颜色填充
有一些比GD更好(更简单)的库可以做到这一点吗


非常感谢

我会为你的页面选择一些标准的头像图像大小,比如

  • 中等大小的个人资料页,如果您有一个和
  • 显示在用户帖子旁边的小尺寸
  • 你有了这个想法,正是你需要的
当用户上传一个新的头像时,你可以通过合理的质量设置将它转换成你需要的格式。我假设您使用的是JPEG,因为这是一种很好的通用格式。PNG在图片内容方面做得很差,JPEG对于绘画来说并不是很好,但你们看到的大多数头像都是照片。现在我不再使用GIF了,它们限制为256色,只有1位alpha通道。

您可以使用来调整图像大小。这个库使用GD。这里有一些


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

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

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

以下是我推荐的流程:

1) 将图像调整为您的输出格式。如果需要,也可以在此处强制剪切纵横比

2) 确定原始源模式:

  • 8位索引(GIF/PNG8):另存为PNG8(格式往往小于GIF)
  • 16-24位:另存为JPG。质量取决于您,但70%是一个很好的基准
  • 32位(PNG24):另存为PNG24,注意保持透明度
注意,此解决方案几乎会破坏任何“动画”GIF,但是。。。这就是当您尝试调整动画gif的大小时发生的情况

虽然。。。我还强烈建议不要将此作为一个单阶段过程并删除原始文件。这是一种以后只会回来咬你的东西

现在磁盘空间很便宜。。。最好以高质量格式(即使是2K x 2K分辨率)存储原始图像,然后创建一个图像服务,该服务将提供您所需的分辨率/质量并缓存结果。


<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>
//此函数将按比例调整图像大小 函数resizeImage($CurWidth、$CurHeight、$MaxSize、$DestFolder、$SrcImage、$Quality、$ImageType) { //检查图像大小是否为0
如果($CurWidth关于
imagemagick
?imagemagick的性能优于PHP GD。为什么GD会是这样呢?好主意John。虽然我正在尝试优化它以将图像存储在数据库中。我知道,这不是最好的主意,但需求是这样说的。@Michael J.V.-对不起,你是对的。我认为GD和imagemagick是一个很好的选择,重点是t我忘了做的是OP有一大堆工作要做,并且给出了流程提示。我从来没有碰过任何类型的库,因为这往往是目的驱动的东西,而库从来没有真正做过你想让它们做的事情。@santiagobasaulto-如果你想把图像保存在数据库中,好(有点),但通过使用类似于我上面描述的高速缓存系统,您将解决此类存储的并发问题。也就是说,直到您意识到,如果以后需要扩展存储,它将给您带来麻烦。:)