使用带有Java的GraphicsMagick图像大小调整真的很慢吗?

时间:2013-10-05 13:33:53

标签: java image-processing image-resizing

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

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

400万像素版本使用原生JavaIO + scalr每张图片需要270毫秒,使用GraphicsMagick需要360毫秒。 6400万像素的图片使用JavaIO + scalr需要3100ms来调整大小,使用GraphicsMagick需要4300ms。

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

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

**更新**:

做一些数学运算:64M / 3秒= 20M /秒/2.6GHz = 10Mio / GHz = 1pixel / 100时钟周期。所以它接缝几乎可以。对于4M,我们有:3M /3sec = 9M / sec = 1pix / 200个循环。

所以这里有一个更新的问题:为了快速加载图像,是否有一种格式可能会破坏内存?因为SSD很慢(64M * 3 = 192MB,4M * 3 = 12MB),最好的是原始/位图可能需要一秒钟才能加载。但是介于两者之间吗?我怀疑使用质量较差的JPeg会成为交易,因为它接缝不会加速减压。

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

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

2 个答案:

答案 0 :(得分:0)

64万像素的图像非常大。如果任何一台PC可以调整1K /秒,甚至10 /秒

,我会感到惊讶

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

答案 1 :(得分:0)

这里看起来没什么不对。我决定使用ImgScalr lib并使用ImageIO。产生最快的结果。我使用的jpegs也是97%的质量和再压缩(改变大小后)。 64M JPEG文件大小为5.8MB,加载速度很慢(1.5秒),但在默认质量保存后,我在0.5秒内得到1.8MB文件加载。这使它更实际。

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

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