0

我需要根据需要调整一些图像的大小(并锐化和旋转)以创建各种分辨率。我有一台小型开发计算机(Ivy Celeron @ 2.6GHz)。我的小测试图片拍摄了一张可爱的小猫图片的 64 兆像素(分辨率)和 4 兆像素版本,并将两个版本都缩小到 750 x 400(目标尺寸)。

一个版本使用 JavaIO + ImgScalr,另一个版本使用Graphics Magick + im4java

4 兆像素版本使用原生 JavaIO + scalr 每张图片需要 270 毫秒,使用 GraphicsMagick 需要 360 毫秒。一张 64 兆像素的图片使用 JavaIO + scalr 需要 3100 毫秒来调整大小,而使用 GraphicsMagick 需要 4300 毫秒。

我在这里错过了什么吗。大部分时间都花在打开和读取文件并保存结果上,但使用 GraphicsMagick 的缩放速度要慢得多。我知道这些与一些更高级算法的用户有关,但最终结果在两个版本中看起来都非常好,而且我没想到我的 2013 年计算机每秒不能处理至少 1000 张图像,但几乎没有每秒 3 到 0.3 张图片。

那么问题来了,我做错了什么?您调整图像大小的措施是什么?我真的需要一整台服务器来处理每秒 10 张图片吗?

** 更新 **:

做一些数学运算:64M / 3seconds = 20M/sec / 2.6GHz = 10Mio/GHz = 1pixel/100 Clock-Cycles。所以它看起来几乎没问题。对于 4M,我们有:3M /.3sec = 9M/sec = 1pix/200 个周期。

所以这里有一个更新的问题:是否有一种格式可能会为了快速加载图像而牺牲内存?最好的方法是加载原始/位图可能需要一秒钟,因为 SSD 很慢(64M*3 = 192MB,4M*3=12MB)。但中间有什么东西吗?我怀疑使用质量较差的 JPeg 是否可行,因为它似乎不会加速解压缩。

也许是带有分离颜色通道的压缩位图?(不要笑!:-))。也许还有一些。ZIP 有多快?

还有一个想法是提供多种分辨率(一次惩罚)并使用最接近的可用分辨率版本。1M 分辨率在内存中将是 4M,并且应该导致每秒 12 次图片转换 (argh)。我已经准备好看到至少 1000 次/秒,但在过去 10 年中计算机电源接缝的飞跃不会那么大。我将尝试使用两个或更多工作线程并行启动它。让我们看看这是否会翻倍。

4

2 回答 2

0

64兆像素的图像相当大。如果任何 PC 可以调整其中的 1K / 秒,甚至 10 / 秒,我会感到惊讶

您可以查看此答案以了解可能更高效的方式(https://stackoverflow.com/a/8365035/234901)。但请注意,图像质量和处理时间需要权衡取舍。

于 2013-10-05T14:06:43.620 回答
0

看起来这里没什么问题。我选择了 ImgScalr 库并使用 ImageIO。产生最快的结果。此外,我使用的 jpeg 质量为 97%,并且经过重新压缩(更改大小后)。64M JPEG 的文件大小为 5.8MB,加载速度很慢(1.5 秒),但在以默认质量保存后,我在 0.5 秒内加载了 1.8MB 的文件。这使它更实用。

该软件现在可以自动缩放大约 50 张个人资料图片和 260 张缩略图。这已经足够快了,因为它只有在没有结果副本存储在 CDN 中时才会扩展。所以一切又好了。

我真的很震惊,我想到了每秒 1k,但最终有大约 50 个,在服务器上大约 200 个(估计)是可以的。

于 2013-10-05T22:11:01.990 回答