将BufferedImage转换为2D数组

时间:2013-06-18 17:10:44

标签: java

我有一个BufferedImage,它代表一个2048X2048像素的tiff图像。我想从BufferedImage中检索这样的数组(int [2048] [2048]。我该怎么办?

2 个答案:

答案 0 :(得分:2)

arr = new int[2048][2048];

for(int i = 0; i < 2048; i++)
    for(int j = 0; j < 2048; j++)
        arr[i][j] = image.getRGB(i, j);

由于您可以从图像数据结构本身获取每个像素的RGB值,因此将所有内容复制到二维数组可能是有益的。

答案 1 :(得分:1)

此方法将直接为每个像素返回红色,绿色和蓝色值,如果有Alpha通道,则会添加alpha值。使用这种方法在计算指数方面更难,但比第一种方法快得多。

 private static int[][] convertTo2DWithoutUsingGetRGB(BufferedImage image) {

  final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
  final int width = image.getWidth();
  final int height = image.getHeight();
  final boolean hasAlphaChannel = image.getAlphaRaster() != null;

  int[][] result = new int[height][width];
  if (hasAlphaChannel) {
     final int pixelLength = 4;
     for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
        int argb = 0;
        argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
        argb += ((int) pixels[pixel + 1] & 0xff); // blue
        argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
        argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
        result[row][col] = argb;
        col++;
        if (col == width) {
           col = 0;
           row++;
        }
     }
  } else {
     final int pixelLength = 3;
     for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
        int argb = 0;
        argb += -16777216; // 255 alpha
        argb += ((int) pixels[pixel] & 0xff); // blue
        argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
        argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
        result[row][col] = argb;
        col++;
        if (col == width) {
           col = 0;
           row++;
        }
     }
  }

  return result;
 }