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

时间:2021-10-28 08:59:39

I'm trying to get the pixel rgb values from a 64 x 48 bit image. I get some values but nowhere near the 3072 (= 64 x 48) values that I'm expecting. I also get:

我试图从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)

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;
}

}

6 个解决方案

#1


12  

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, i.e. i contains y values and j contains x values. That's backwards.

我计算行数,j列数,也就是i包含y值,j包含x值。这是倒退。

#2


5  

This works too:

其工作原理:

BufferedImage img = ImageIO.read(file);

int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();

#3


5  

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[]在这里,像素的格式由ColorModel从pg.getColorModel(),或者你可以改变这一假为真,迫使RGB8-in-ints。

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.*.

之后我发现,光栅和图像类也可以这样做,也有一些有用的类添加到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.

有几种获取像素(…)方法在光栅。

#4


3  

int argb = img.getRGB(x, y); Your code

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

int argb = img.getRGB(y, x); my changes now it works

int argb = img。getRGB(y、x);我的改变现在起作用了

#5


2  

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. You switched the parameters.

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

#6


1  

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.

这是内置的,男人。

#1


12  

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, i.e. i contains y values and j contains x values. That's backwards.

我计算行数,j列数,也就是i包含y值,j包含x值。这是倒退。

#2


5  

This works too:

其工作原理:

BufferedImage img = ImageIO.read(file);

int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();

#3


5  

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[]在这里,像素的格式由ColorModel从pg.getColorModel(),或者你可以改变这一假为真,迫使RGB8-in-ints。

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.*.

之后我发现,光栅和图像类也可以这样做,也有一些有用的类添加到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.

有几种获取像素(…)方法在光栅。

#4


3  

int argb = img.getRGB(x, y); Your code

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

int argb = img.getRGB(y, x); my changes now it works

int argb = img。getRGB(y、x);我的改变现在起作用了

#5


2  

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. You switched the parameters.

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

#6


1  

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.

这是内置的,男人。