我有一个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%左右工作
答案 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百万,写入时间太长了