提高图像应用性能

时间:2012-03-21 10:44:22

标签: java javax.imageio

我有一个java se 6应用程序,它接收10到15个BufferedImage。

应用程序必须在共享内存中写入这些BufferedImage,以便C程序读取并显示图像。

问题是图像很大,从1900 * 1600到800 * 600,而使用ImageIO的byte []转换需要很长时间:最大图像需要50ms。我需要这个byte []写入内存,ImageIo是我找到的最快的方式。

如果我有4张大图像,刷新图像需要50 * 4 = 200 ms :(

你知道我怎么能改进它吗? 我应该关心1个线程中的1个图像吗?我将有15个线程,并且cpu已经在60%左右工作

2 个答案:

答案 0 :(得分:0)

而不是使用imageio编写图像。你试过GetPixels()吗? imageio将数据写入特定的编解码器,如TIFF / MJPEG。 你需要它的实际数据(像素)。 现在你需要编写C代码才能渲染像素。 (你打算如何将数据传递给C代码?指针???)。

答案 1 :(得分:0)

以下是我跑过的基准测试的反馈:

resumse:似乎ImageIO是最优化的图像处理类。

流程:BufferedImage => byte [] =>字节[] => int [] =>写
注意:使用ImageIO转换字节[]

中的图像

image 1900 * 1600
从BufferedImage获取一个byte []:45 ms
cast byte [] zh Byte []:0 ms
写入内存:4到9毫秒

图像1280 * 1024
从BufferedImage获取一个byte []:20到23毫秒
cast byte [] zh Byte []:0 ms
写入内存:4到7毫秒

图像800 * 600
从BufferedImage获取一个byte []:9 ms
cast byte [] zh Byte []:0 ms
写在备忘录:3到5毫秒

==>线性处理,我们可以得到的最好的

流程:BufferedImage => int [] =>写
注意:在int []中使用getRGB转换图像
image 1900 * 1600:2500 ms

==> getRGB得到每个图像像素:你要写的3百万:太长了


过程:BufferedImage => Raster => DataBuffer =>写

从BufferedImage获取DataBuffer:0 ms
写在回忆录:2500毫秒

图像1900 * 1600:2500毫秒

==> DataBuffer的大小为3百万,写入时间太长了