【问题标题】:What is the best way to load-manipulate-update picture/pixels?加载-操作-更新图片/像素的最佳方法是什么?
【发布时间】:2015-03-26 13:17:49
【问题描述】:

有 BufferedImage(顺便说一句,它是存储和编辑帧图形的最佳方式吗?)以及对这个图像进行一些编辑的函数。

我目前的做法:

 //usage: 
image.setData(update(image.getRaster()));


public Raster update(WritableRaster raster) {
    int[] pixels = new int[raster.getWidth() * raster.getHeight()];
    raster.getDataElements(0, 0, w, h, pixels); // raster to int[]
  //pixels array operations      
    raster.setDataElements(0, 0, w, h, pixels); // int[] to raster
    return raster;
}

发送栅格似乎是这种方法的瓶颈,但还有哪些其他选择?

【问题讨论】:

  • 您可以使用setRGB 将像素直接写入BufferedImage。除非您分析了特定的像素操作并发现这是一个瓶颈,否则优化它似乎为时过早。

标签: java bitmap pixel bufferedimage raster


【解决方案1】:

您可以通过将颜色值直接存储在光栅中来有效地写入图像中的任何像素。我发现以这种方式动态操作图像的最高效的方法是这样的:

BufferedImage image = new BufferedImage(inputWidth, inputHeight, BufferedImage.TYPE_INT_ARGB);
        int[] rgbRaster = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

        for(int i = 0; i < inputHeight; i++) {
            for(int j = 0; j < inputWidth; j++) {
                int index = (inputWidth  * i) + j;
                rgbRaster[index] = SOME_ARG_VALUE;
                }
            }
        }

当然,您不必一遍又一遍地重新创建图像或光栅阵列,只需创建一次,然后在需要时写入阵列。非常快,而且非常简单。

【讨论】:

  • 感谢您的帮助。随意查看结果。 youtube.com/watch?v=ISKOBmh_sqMtextuploader.com/xj7j
  • 如果有帮助,希望您将我的标记为答案。 AFAIK,它是在 java 中动态更新 BufferedImages 的最快方法。不过效果不错, - 直接光栅操作的典型案例。干得好。
【解决方案2】:

您的代码中的瓶颈实际上是image.setData(...),因为它会将Raster 中的所有数据复制到您的图像中(即使您在update(...) 方法中只修改了一个像素) )。

但是,在这种情况下这是完全没有必要的,因为 image.getRaster() 返回的 WritableRaster 代表像素的“实时视图”。简单地使用:

update(image.getRaster());

...应该可以,而且要快得多。

如果您知道您的图像是TYPE_INT_*,您可以按照@Terje 的建议进行操作,并直接访问底层数据缓冲区。这可能会更快。请注意,像素阵列也是“实时视图”,因此对阵列的任何更改都会反映在图像中。

int[] rgb = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

这两种方法都可能使图像显示速度变慢(也称为“非托管”),但对于一般图像处理来说,它们应该没问题。

【讨论】:

  • 假设该类使用包括图像在内的参数创建,这是我发现的奇怪行为:Update() 仅适用于构造函数创建的图像和方法创建的 int[]; Update2(BufferedImage) 与此方法中创建的 image 和 int[] 一起使用; Update3() 适用于在构造函数中创建的 image 和 int[];显然 update3 是最快的,但 update2 在某种程度上比 update1 快。
  • @abvgde 对不起,还是不明白...您是否编辑过您的问题以添加新的update 方法?如果是这样,我看不到它们,所以我不知道它们是什么样的......
  • 没关系,没关系。我很不擅长描述。您可以查看它的用途,视频和课程的链接在其他评论部分。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2020-09-07
  • 2021-06-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多