【问题标题】:How to optimize images in PHP?如何在 PHP 中优化图像?
【发布时间】:2011-10-04 10:41:10
【问题描述】:

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

我想在他们加载图片时对其进行一些优化。

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

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

  • 调整大小
  • 质量低

可能:

  • 将其转换为 GIF
  • 对透明 PNG 进行颜色填充

有一些比 GD 更好(更简单)的库可以做到这一点吗?

非常感谢!

【问题讨论】:

标签: php image-processing imagemagick gd


【解决方案1】:

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

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

这是我推荐的流程:

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

2) 确定原始源模式:

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

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

虽然...我也强烈建议不要将其作为单阶段过程执行并删除原始文件。这种东西以后只会回来咬你。

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

【讨论】:

  • ImageMagick 的性能优于 PHP GD。为什么GD会是这样?
  • 好主意,约翰。尽管我正在尝试优化它以将图像存储在数据库中。我知道,这不是最好的主意,但要求是这样说的。
  • @Michael J.V. - 对不起,你是对的。我认为 GD 和 ImageMagick 是类比的,我忘记说明的一点是 OP 有很多工作要做,并且正在提供流程提示。我从来没有遇到过任何类型的库,因为这往往是目的驱动的东西,而库从来没有真正做你想让他们做的事情。
  • @santiagobasaulto - 如果您想将图像保留在数据库中,很好(有点),但是通过使用类似于我上面描述的缓存系统,您将处理并发性围绕这种存储的问题。也就是说,直到您意识到如果/当您需要扩展时,存储会在以后让您头疼。 :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    <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>
    

    【讨论】:

      【解决方案4】:

      我会选择一些您的页面需要的标准头像图像尺寸,例如

      • 个人资料页面的中等大小(如果您有的话)
      • 显示在用户帖子旁边的小尺寸
      • 你明白了,正是你需要的

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多