2012-03-21 112 views
2

我有一个java se 6应用程序,它接收10到15 BufferedImage。提高图像应用程序性能

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

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

如果我有4倍大的图像,它需要50 * 4 = 200毫秒刷新图像:(

你有任何想法我怎么能提高呢? 我应该关心1图像中1线?我将有15个线程和CPU已经工作的60%左右

回答

0

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

+0

不幸的是我没有更多时间来完整地尝试它:( 与我最后的测试,似乎,出人意料地给出了下面的基准,getPixels具有良好的回答时间。 如果人们正在努力改进他们的过程,他们应该尝试一下,也许可以证实? – Foobyto 2012-04-05 14:03:12

0

这里是基准反馈我拼命地跑:

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

过程:的BufferedImage =>字节[] =>字节] => INT [] =>写
注:在字节使用的ImageIO用于转换图像[]

图像1900 * 1600
从的BufferedImage得到一个字节[]:45毫秒
铸造字节[]烯字节[]:0毫秒
写在存储器:4 A 9毫秒

伊马GE 1280 * 1024
从BufferedImage的得到一个字节[]:20 A 23毫秒
铸造字节[]烯字节[]:0毫秒
写在存储器:4 A 7毫秒

图像800 * 600
得到的BufferedImage一个字节[]:9毫秒
铸造字节[]烯字节[]:0毫秒
写在备忘录:3 5毫秒

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

过程:BufferedImage的=> INT [] =>写
注:在INT使用的getRGB用于转换图像[]

图像1900 * 1600:2500毫秒

==>的getRGB得到每个图像像素:300万,你必须写:太长时间


过程:BUF feredImage =>栅格=>的DataBuffer =>写

从BufferedImage的获得的DataBuffer:0毫秒
写在备忘录:2500毫秒

图像1900 * 1600:2500毫秒

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