PHP图像大小调整 - 意见通缉

时间:2011-06-08 16:54:45

标签: php image-processing resize image-resizing

我一直在环顾四周,想知道每个人用来调整图像的大小,以防错过。

我正在使用php imageGD库imagejpeg()等。

我不断更新我的课程,尝试“解决”这种情况:

如果用户上传的图像是469x358,则显示结束图片需要或者设计为适合120x80的盒子。如果我根据宽度调整大小,生成的调整大小的图像将是120x92,我可以然后修复高度,但这将像素化或挤压图像,我也可以使用imageGD或css溢出隐藏来裁剪结束。

我快速浏览了一下,看到有一些算法(双三次等)可以用来缩小图像,使图像变得清晰,因此它看起来不会被压扁,这是我用imageGD看到的连续效果。有人用这个算法吗?

我也见过ImageMagick有人用过这个软件吗?它会更好地缩小图像吗?

我目前正在以溢出隐藏的方式裁剪结束,但有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

  

如果用户上传的图片是说   469x358和显示结束图片   需要设计或适合   例如,在一个120x80的盒子里。如果我   根据结果​​的宽度调整大小   调整大小的图像将是120x92,我可以   然后修复高度,但那会   像素化或压缩图像,我可以   也可以结束任何一个结束   imageGD或css溢出隐藏。

如果您的图像是358x469(纵向)并且您想要将其调整为120x80以使图像看起来不会扭曲,则可以使用以下数字:

358/469 = width/80 => width = 358*80/469 = 61px (approx)

我们有一个更高的图像,我们将使用最大高度和约束宽度。所需的120px宽度意味着图像水平拉伸;使用更好的算法,你只能实现平滑,但你不能用更好的算法使压扁/拉伸图像看起来正常。

如果需要进行拟合,我建议你适应大小调整。您可以通过GD库/ ImageMagick在服务器端执行此操作,也可以使用CSS后台定位在客户端执行此操作。如果您正在使用GD,裁剪就像使用负偏移调整图像大小一样简单(有点类似于具有负背景位置的CSS背景定位)。

编辑1

如果是使用GD或IM的问题,我建议使用IM。我不确定输出的质量,但就性能而言,IM将胜过GD,特别是在处理高分辨率图像时。如果您更喜欢GD,GD库函数imagecopyresampled将比imagecopyresized提供更好的结果,但CPU和/或内存使用率更高。

编辑2

我忘了提及,我很久以前就停止使用GD并切换到phpThumb。照顾大部分家务。在内部它使用GD和/或IM - 内置智能让它为给定的操作选择最佳的可用方法。

答案 1 :(得分:0)

可能有助于您做出决定的几点。

  • ImageMagick和gd2的重采样输出大致相似。我不确定gd2执行什么样的重采样,并且我相当确定ImageMagick使用双三次插值,但无论哪种方式,对于大多数情况,双三次和双线性重采样生成的输出在缩小尺寸时几乎相同。提升小图像是双三次插值真正分开的地方。 (尽管如此,有一些病态情况,双三次和双线性插值之间的区别可能很明显 - 请查看http://en.wikipedia.org/wiki/Aliasing

  • 我没有太多机会在​​PHP中使用ImageMagick模块,尽管CLI版本对于重新采样图像非常快速。假设Imagick模块同样快,您应该看到快速的性能。然而,在gd2的情况下,速度已经成为一个问题 - 我经常使用它来生成每页50多个缩略图,并且滞后是明显的。

  • gd2是大多数PHP安装的一部分,API使用起来相当简单。 Imagick似乎是PECL扩展。根据您的托管服务提供商,这可能是也可能不是问题。

那就是说,让我指出缓存已调整大小的图像是几乎总是更好的主意 - 特别是如果你确定同一图像会经常调整大小。例如,如果您正在创建一些在线商店并希望显示图像缩略图,那么如果您一次又一次地通过缩放器运行相同的图像集,则会特别糟糕。 OTOH适用于图像变化较大的应用程序,动态调整大小可能是更好的选择。