Получение данных пикселей из изображения с использованием Java - PullRequest
15 голосов
/ 22 октября 2009

Я пытаюсь получить значения rgb пикселей из 64 x 48 битного изображения. Я получаю некоторые значения, но они не соответствуют ожидаемым значениям 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 < 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 ]

12 голосов
/ 22 октября 2009

Это:

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) {

У вас есть i подсчет строк и j столбцов, т.е. i содержит y значений и j содержит x значений. Это назад.

5 голосов
/ 26 декабря 2011

Это тоже работает:

BufferedImage img = ImageIO.read(file);

int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
5 голосов
/ 23 апреля 2010

Я искал эту же способность. Я не хотел перечислять все изображение целиком, поэтому я немного искал и использовал 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[] прямо здесь, пиксели в формате, определяемом ColorModel от pg.getColorModel(), или вы можете изменить это значение false на true и установить значение RGB8-in-ints.

С тех пор я обнаружил, что классы Raster и Image тоже могут это делать, и в 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(...) методов.

3 голосов
/ 11 августа 2010

int argb = img.getRGB(x, y); Ваш код

int argb = img.getRGB(y, x); мои изменения теперь работают

2 голосов
/ 22 октября 2009

Вы должны изменить:

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 -значение, а третьим является y -значение. Вы переключили параметры.

1 голос
/ 23 августа 2010

Почему не использовать, просто используйте:

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

Он встроенный, мужик.

...