使用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)
这是内置的,伙计。