2

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

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

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

例如,如果用户上传的图像是 469x358 并且显示端图片需要或设计为适合 120x80 框。如果我根据宽度调整大小,则结果调整后的图像将是 120x92,然后我可以修复高度,但这会使图像像素化或压扁,我也可以通过隐藏 imageGD 或 css 溢出来裁剪末端。

我快速浏览了一下,发现有一些算法(双三次等)可用于缩小图像,使其锐化,使其看起来不会被压扁,这是我似乎使用 imageGD 获得的持续效果。有人用过这个算法吗?

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

我目前正在通过隐藏溢出来裁剪结尾,但是有更好的方法吗?

4

2 回答 2

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,与CPU 和/或内存使用率imagecopyresampled相比,GD 库函数将为您提供更好的结果。imagecopyresized

编辑 2

我忘了说,我很久以前就停止使用 GD 并切换到phpThumb。负责大部分家务。在内部,它使用 GD 和/或 IM——内置智能允许它为给定操作选择最佳可用方法。

于 2011-06-09T07:34:35.960 回答
0

几点可能会帮助您做出决定。

  • ImageMagick 和 gd2 的重采样输出非常相似。我不确定 gd2 执行什么样的重采样,并且我相当确定 ImageMagick 使用双三次插值,但无论哪种方式,对于大多数情况,双三次和双线性重采样在缩小尺寸时生成几乎相同的输出。放大小图像是双三次插值真正与众不同的地方。(即便如此,在某些病理情况下,双三次插值和双线性插值之间的差异可能会很显着——请查看http://en.wikipedia.org/wiki/Aliasing

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

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

也就是说,让我指出,缓存调整大小的图像几乎总是一个更好的主意——特别是如果你确定同一张图像会经常调整大小。例如,如果您正在创建某个在线商店并想要显示图像缩略图,那么如果您一次又一次地通过调整大小运行同一组图像,那将特别糟糕。OTOH 对于图像变化更大的应用程序,即时调整大小可能是更好的选择。

于 2011-06-08T18:13:24.797 回答