我有一个MxN的彩色图像,行x列格式。我想将图像的所有红色成分存储在一个单独的矩阵中,所有绿色成分都存储在一个单独的矩阵中,所有蓝色成分都存储在一个单独的矩阵中。对所有三个矩阵执行变换并生成混洗的RGB图像。我可以使用下面的代码将它存储在单个矩阵中,但无法将其存储在三个单独的矩阵中。
double[][] img = new double[bi.getHeight()][bi.getWidth()];
img[i][j] = bi.getRGB(i, j);
答案 0 :(得分:1)
从Understanding BufferedImage.getRGB output values开始,您有几种可能性:
您需要初始化数组:
int[][] blue = new int[bi.getHeight()][bi.getWidth()];
int[][] green = new int[bi.getHeight()][bi.getWidth()];
int[][] red = new int[bi.getHeight()][bi.getWidth()];
int[][] alpha = new int[bi.getHeight()][bi.getWidth()];
1)最简单易懂,更多开销:使用Color
Color mycolor = new Color(img.getRGB(x, y));
red[x][y] = mycolor.getRed();
blue[x][y] = mycolor.getBlue();
green[x][y] = mycolor.getGreen();
2)do those computations by hand
int color = bi.getRGB(x, y);
// Components will be in the range of 0..255:
blue[x][y] = color & 0xff;
green[x][y] = (color & 0xff00) >> 8;
red[x][y] = (color & 0xff0000) >> 16;
alpha[x][y] = (color & 0xff000000) >>> 24;
3)print as a String并再次提取值(这更多是理论值,不要在不知道你做什么的情况下使用它)
将值打印为无符号32位十六进制值:
String s = Integer.toString(bi.getRGB(x,y), 16)
blue[x][y] = Integer.parseInt(s.substring(24, 32), 2);
green[x][y] = Integer.parseInt(s.substring(16, 24), 2);
red[x][y] = Integer.parseInt(s.substring(8, 16), 2);
alpha[x][y] = Integer.parseInt(s.substring(0, 8), 2);
输出的每两个字符将是ARGB集的一部分。
4)使用ColorModel
(目前还不清楚是否可以这样做)
它有getAlpha
,getRed
等方法,但像素是单个1-D数组。如果有人知道如何使用它,请随意。