我需要根据需要调整一些图像的大小(并锐化和旋转)以创建各种分辨率。我有一台小型开发计算机(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 年中计算机电源接缝的飞跃不会那么大。我将尝试使用两个或更多工作线程并行启动它。让我们看看这是否会翻倍。