给定一个图像文件,比如PNG格式,如何获得一个int [r,g,b,a]数组,表示位于第i行第j列的像素?
到目前为止,我从这里开始:
private static int[][][] getPixels(BufferedImage image) {
final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
final int width = image.getWidth();
final int height = image.getHeight();
int[][][] result = new int[height][width][4];
// SOLUTION GOES HERE....
}
提前致谢!
答案 0 :(得分:3)
您需要将打包的像素值作为int
,然后您可以使用Color(int, boolean)
来构建一个颜色对象,您可以从中提取RGBA值,例如......
private static int[][][] getPixels(BufferedImage image) {
int[][][] result = new int[height][width][4];
for (int x = 0; x < image.getWidth(); x++) {
for (int y = 0; y < image.getHeight(); y++) {
Color c = new Color(image.getRGB(i, j), true);
result[y][x][0] = c.getRed();
result[y][x][1] = c.getGreen();
result[y][x][2] = c.getBlue();
result[y][x][3] = c.getAlpha();
}
}
}
它不是最有效的方法,但它是最简单的方法之一
答案 1 :(得分:2)
BufferedImages有一个名为getRGB(int x,int y)的方法,它返回一个int,其中每个字节是像素的组成部分(alpha,red,green和blue)。如果你不想自己做bitwise运算符,你可以使用Color.getRed / Green / Blue方法,通过getRGB中的int创建一个新的Java.awt.Color实例。
您可以在循环中执行此操作以填充三维数组。
答案 2 :(得分:0)
这是我针对此问题的代码:
File f = new File(filePath);//image path with image name like "lena.jpg"
img = ImageIO.read(f);
if (img==null) //if img null return
return;
//3d array [x][y][a,r,g,b]
int [][][]pixel3DArray= new int[img.getWidth()][img.getHeight()][4];
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int px = img.getRGB(x,y); //get pixel on x,y location
//get alpha;
pixel3DArray[x][y][0] =(px >> 24)& 0xff; //shift number and mask
//get red
pixel3DArray[x][y][1] =(px >> 16)& 0xff;
//get green
pixel3DArray[x][y][2] =(px >> 8)& 0xff;
//get blue
pixel3DArray[x][y][3] =(px >> 0)& 0xff;
}
}