加载 - 操作 - 更新图片/像素的最佳方法是什么?

时间:2015-03-26 13:17:49

标签: java bitmap pixel bufferedimage raster

有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;
}

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

2 个答案:

答案 0 :(得分: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;
                }
            }
        }

当然,您不必一遍又一遍地重新创建图像或栅格数组,只需创建一次,然后在需要时写入数组。很快,也很容易。

答案 1 :(得分:0)

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

但是,在这种情况下完全没有必要,因为WritableRaster返回的image.getRaster()表示&#34;实时视图&#34;到像素。只需使用:

update(image.getRaster());

......应该做,并且要快得多。

如果你知道你的图像是TYPE_INT_*,你可以像@Terje建议的那样做,并直接访问底层数据缓冲区。这可能会更快。请注意,像素阵列也是一个&#34;实时视图&#34;,因此对阵列的任何更改都将反映在图像中。

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

这两种方法都可能使图像显示较慢(又名&#34;非托管&#34;),但对于一般的图像处理,它们应该没问题。