使用java从图像中获取像素数据

我试图从64 x 48位图像中获取像素rgb值。 我得到了一些值,但远不及我期待的3072 (= 64 x 48)值。 我也得到:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:301) at java.awt.image.BufferedImage.getRGB(BufferedImage.java:871) at imagetesting.Main.getPixelData(Main.java:45) at imagetesting.Main.main(Main.java:27) 

我找不到越界错误…

这是代码:

 package imagetesting; import java.io.IOException; import javax.imageio.ImageIO; import java.io.File; import java.awt.image.BufferedImage; public class Main { public static final String IMG = "matty.jpg"; public static void main(String[] args) { BufferedImage img; try { img = ImageIO.read(new File(IMG)); int[][] pixelData = new int[img.getHeight() * img.getWidth()][3]; int[] rgb; int counter = 0; for(int i = 0; i < img.getHeight(); i++){ for(int j = 0; j < img.getWidth(); j++){ rgb = getPixelData(img, i, j); for(int k = 0; k > 16) & 0xff, //red (argb >> 8) & 0xff, //green (argb ) & 0xff //blue }; System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]); return rgb; } } 

这个:

 for(int i = 0; i < img.getHeight(); i++){ for(int j = 0; j < img.getWidth(); j++){ rgb = getPixelData(img, i, j); 

与此不匹配:

 private static int[] getPixelData(BufferedImage img, int x, int y) { 

你有计数行和j列,即i包含y值, j包含x值。 那是倒退。

这也有效:

 BufferedImage img = ImageIO.read(file); int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData(); 

我一直在寻找同样的能力。 不想枚举整个图像,所以我做了一些搜索并使用了PixelGrabber。

 Image img = Toolkit.getDefaultToolkit().createImage(filename); PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, false); pg.grabPixels(); // Throws InterruptedException width = pg.getWidth(); height = pg.getHeight(); int[] pixels = (int[])pg.getPixels(); 

你可以在这里直接使用int[] ,像素是由pg.getColorModel()的ColorModel指定的格式,或者你可以将false改为true并强制它为RGB8-in-int。

我已经发现Raster和Image类也可以这样做,并且在javax.imageio.*添加了一些有用的类javax.imageio.*

 BufferedImage img = ImageIO.read(new File(filename)); // Throws IOException int[] pixels = img.getRGB(0,0, img.getWidth(), img.getHeight, null, 0, img.getWidth()); // also available through the BufferedImage's Raster, in multiple formats. Raster r = img.getData(); int[] pixels = r.getPixels(0,0,r.getWidth(), r.getHeight(), (int[])null); 

Raster也有几种getPixels(...)方法。

int argb = img.getRGB(x, y); 你的代码

int argb = img.getRGB(y, x); 我的改变现在有效

你必须改变:

 for(int i = 0; i < img.getHeight(); i++){ for(int j = 0; j < img.getWidth(); j++){ rgb = getPixelData(img, i, j); 

 for(int i = 0; i < img.getWidth(); i++){ for(int j = 0; j < img.getHeight(); j++){ rgb = getPixelData(img, i, j); 

因为getPixelData的第二个参数是x值,而thirth是y值。 你切换了参数。

为什么不使用只是使用:

 public int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) 

这是内置的,伙计。