[英]Getting pixel data from an image using java
I'm trying to get the pixel rgb values from a 64 x 48
bit image. 我试图从
64 x 48
位图像中获取像素rgb值。 I get some values but nowhere near the 3072 (= 64 x 48)
values that I'm expecting. 我得到了一些值,但远不及我期待的
3072 (= 64 x 48)
值。 I also get: 我也得到:
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)
I can't find the out of bounds error... 我找不到越界错误...
Here's the code: 这是代码:
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 < rgb.length; k++){
pixelData[counter][k] = rgb[k];
}
counter++;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static int[] getPixelData(BufferedImage img, int x, int y) {
int argb = img.getRGB(x, y);
int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >> 8) & 0xff, //green
(argb ) & 0xff //blue
};
System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]);
return rgb;
}
}
This: 这个:
for(int i = 0; i < img.getHeight(); i++){
for(int j = 0; j < img.getWidth(); j++){
rgb = getPixelData(img, i, j);
Does not match up with this: 与此不匹配:
private static int[] getPixelData(BufferedImage img, int x, int y) {
You have i
counting the rows and j
the columns, ie i
contains y values and j
contains x values. 你有
i
计数行和j
列,即i
中包含y值和j
含有x值。 That's backwards. 那是倒退。
I was looking for this same ability. 我一直在寻找同样的能力。 Didn't want to enumerate the entire image, so I did some searching and used PixelGrabber.
不想枚举整个图像,所以我做了一些搜索并使用了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();
You could use the int[]
directly here, pixels are in a format dictated by the ColorModel from pg.getColorModel()
, or you can change that false to true and force it to be RGB8-in-ints. 你可以在这里直接使用
int[]
,像素是由pg.getColorModel()
的ColorModel指定的格式,或者你可以将false改为true并强制它为RGB8-in-int。
I've since discovered that the Raster
and Image classes can do this too, and there have been some useful classes added in javax.imageio.*
. 我已经发现
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);
There are several getPixels(...)
methods in Raster
as well. Raster
也有几种getPixels(...)
方法。
This works too: 这也有效:
BufferedImage img = ImageIO.read(file);
int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
int argb = img.getRGB(x, y);
Your code 你的代码
int argb = img.getRGB(y, x);
my changes now it works 我的改变现在有效
You have to change: 你必须改变:
for(int i = 0; i < img.getHeight(); i++){
for(int j = 0; j < img.getWidth(); j++){
rgb = getPixelData(img, i, j);
Into 成
for(int i = 0; i < img.getWidth(); i++){
for(int j = 0; j < img.getHeight(); j++){
rgb = getPixelData(img, i, j);
Because the second parameter from getPixelData
is the x
-value and the thirth is the y
-value. 因为
getPixelData
的第二个参数是x
值,而thirth是y
值。 You switched the parameters. 你切换了参数。
Why didn't use just use: 为什么不使用只是使用:
public int[] getRGB(int startX,
int startY,
int w,
int h,
int[] rgbArray,
int offset,
int scansize)
It's built-in, man. 它是内置的,伙计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.