【问题标题】:improve image application performance提高图像应用性能
【发布时间】:2012-04-05 22:00:33
【问题描述】:

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

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

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

如果我有 4 张大图片,刷新一张图片需要 50 * 4 = 200 毫秒 :(

你知道我可以如何改进它吗? 我应该关心 1 个线程中的 1 个图像吗?我将有 15 个线程,cpu 已经在 60% 左右工作

【问题讨论】:

    标签: java javax.imageio


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,我没有更多时间充分尝试它 :( 在我最近的测试中,令人惊讶的是,鉴于以下基准,getPixels 有很好的回答时间。如果人们试图改进他们的过程,他们应该尝试一下,也许可以确认一下?
    【解决方案2】:

    这是我运行的基准测试的反馈:

    简历:看起来 ImageIO 是图像处理最优化的类。

    进程:BufferedImage => byte[] => Byte[] => int[] => write
    注意:使用 ImageIO 转换 byte[]

    中的图像

    图像 1900 * 1600
    从 BufferedImage 获取一个字节 []:45 毫秒
    cast byte[] en Byte[] : 0 ms
    写入内存:4 à 9 ms

    图像 1280 * 1024
    从 BufferedImage 获取 byte[]:20 à 23 ms
    cast byte[] en Byte[] : 0 ms
    写入内存:4 à 7 ms

    图像 800 * 600
    从 BufferedImage 获取一个字节 []:9 毫秒
    cast byte[] en Byte[] : 0 ms
    写在回忆录中:3 à 5 ms

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

    进程:BufferedImage => int[] => write
    注意:使用 getRGB 转换 int[] 中的图像

    图片 1900 * 1600 : 2500 毫秒

    ==> getRGB 获取每个图像像素:300 万 你要写的:太长了


    处理:BufferedImage => Raster => DataBuffer => write

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

    图像 1900 * 1600 : 2500 毫秒

    ==> DataBuffer 大小为 300 万,写入时间太长

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多