# Bild in Array einlesen



## Juscho (8. Jun 2005)

Hi!

ich bin dabei ein programm zu schreiben, wasd 2 Bilder vergleichen soll pixel für pixel, dafür muss ich das bild in ein int-array überführen und habe PixelGrabber verwendet, leider treten fehler dabei auf


-1
Uncaught error fetching image:
java.lang.ArrayIndexOutOfBoundsException: 1
        at java.awt.image.PixelGrabber.setPixels(PixelGrabber.java:595)
        at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)-267552
        at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
        at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
        at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119
)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.j
ava:246)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)


> ```
> import java.applet.Applet;
> import java.awt.*;
> import java.awt.image.*;
> ...


----------



## Wildcard (8. Jun 2005)

Wenn du eine ArrayIndexOutOfBoundsException bei 1! kriegst würd ich mal stark davon ausgehen das das Bild nicht richtig geladen wurde...


----------



## Juscho (8. Jun 2005)

was hat java dann für ein problem, wie kann man das bild korrekt laden, in der ausgabe wird es allerdings dargestellt also visuell


----------



## Wildcard (8. Jun 2005)

Dann wirds wohl auch geladen sein.  An welcher Stelle passiert den der Fehler? :?


----------



## Juscho (8. Jun 2005)

Ich geh mal davon aus, dass die Ursache hier liegt

      PixelGrabber grabber = new PixelGrabber(img, 0, 0, width1, hoehe1, pix, 0, width1);
         try {
             grabber.grabPixels();
         }
         catch (InterruptedException e) {
             e.printStackTrace();
         }


----------



## Wildcard (8. Jun 2005)

was heißt du gehst davon aus? Das steht ja wohl in der Exception...


----------



## mic_checker (8. Jun 2005)

Poste ansonsten doch einfach deinen ganzen Code wenn du den Fehler nicht selbst findest...sollte aber nicht so schwer sein, einfach gucken welche Zeile angezeigt wird.


----------



## Juscho (8. Jun 2005)

das war schon der ganze Code den ich dort oben hingeschrieben habe, komm an der Stelle nicht weiter sonst hätt ich schon mehr geschrieben :/


----------



## mic_checker (8. Jun 2005)

hast du schon die werte von width1 u. hoehe1 überprüft wenn du das Grabber Objekt erzeugst ?


----------



## Juscho (8. Jun 2005)

Ich habe die Werte überprüft und die Werte stimmen nicht, daraufhin habe ich die Bildwerte mal direkt eingesetzt und auch das liefert mir eine Vielzahl an Errors.


```
PixelGrabber grabber = new PixelGrabber(img, 0, 0, 201, 150, pix, 0, 150);
   		try {
    	   	grabber.grabPixels();
   		}
   		catch (InterruptedException e) {
       		e.printStackTrace();
   		}
```


-1
-267552 Uncaught error fetching image:
java.lang.ArrayIndexOutOfBoundsException: 1
        at java.awt.image.PixelGrabber.setPixels(PixelGrabber.java:595)-267552
        at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)
        at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
        at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
        at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119
)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.j
ava:246)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Uncaught error fetching image:
java.lang.ArrayIndexOutOfBoundsException: 1
        at java.awt.image.PixelGrabber.setPixels(PixelGrabber.java:595)
        at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)
        at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
        at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
        at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119
)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.j
ava:246)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
-267552 Uncaught error fetching image:
java.lang.ArrayIndexOutOfBoundsException: 1
        at java.awt.image.PixelGrabber.setPixels(PixelGrabber.java:595)
        at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)
        at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
        at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
        at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119
)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.j
ava:246)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)


----------



## mic_checker (8. Jun 2005)

Wenn du das Grabber Objekt erzeugst, hast du es da auch angepasst? Also du teilst dem Array ja dort die Größe mit, deshalb muss da der Parameter auch stimmen - so dass das Array zur Aufnahme groß genug ist. Bringt ja nichts wenn du es bei der Erzeugung des PixelGrabber anpasst , aber das Array pix kann nichts aufnehmen....


----------



## Juscho (8. Jun 2005)

Ok habs jetzt als Applikation hinbekommen


```
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class TestKlasse extends JFrame{

	private Image img;
	private Image img2;
	private int[] pix;
	private int[] pix2;

	public TestKlasse() {
		img = getToolkit().getImage("juscho.jpg");
		img2 = getToolkit().getImage("juscho2.jpg");			
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(img, 0);
		mt.addImage(img2, 0);
		try {
		//Warten, bis das Image vollständig geladen ist,
		mt.waitForAll();
		} catch (InterruptedException e) {
		//nothing
		}
		pix = new int[img.getWidth(this)*img.getHeight(this)];
		pix2 = new int[img2.getWidth(this)*img2.getHeight(this)];
		repaint();	
	}
	
	
	public static void main(String[] args) {

	TestKlasse hullala = new TestKlasse();
	hullala.pack();
	hullala.setSize(800,600);
	hullala.show();
	}
	
	public void paint(Graphics g)
	{
		PixelGrabber grabber = new PixelGrabber(img, 0, 0, img.getWidth(this), img.getHeight(this), pix, 0, img.getWidth(this));
		PixelGrabber grabber2 = new PixelGrabber(img2, 0, 0, img.getWidth(this), img.getHeight(this), pix2, 0, img.getWidth(this));
		

		// GRAB
    	try
    	{
      		grabber.grabPixels();
      		grabber2.grabPixels();
    	}
    	catch (Exception e)
    	{
      		System.out.println("PixelGrabber exception"); 
    	}
    
    
		g.drawImage(img,40,40,this);	
		g.drawImage(img2,245,40,this);
		//for(int i=0; i<img.getWidth(this); i++) { for(int j=0; j<img.getHeight(this); j++) { if(pix[(img.getWidth(this)*i)+j]!=pix2[(img.getWidth(this)*i)+j]) {  g.setColor(Color.white); g.drawRect(40+i,200+j,1,1);  } else { g.setColor(Color.black); g.drawRect(40+i,200+j,1,1); }}}
		for(int i=0; i<img.getHeight(this); i++) { for(int j=0; j<img.getWidth(this); j++) { if(pix[(img.getWidth(this)*i)+j]!=pix2[(img.getWidth(this)*i)+j]) {  g.setColor(Color.white); g.drawRect(40+j,200+i,1,1);  } else { g.setColor(Color.black); g.drawRect(40+j,200+i,1,1); }}}
				
	}
	
}
```


----------



## mic_checker (8. Jun 2005)

Funzt es denn damit ? 

Den andern Code solltest du eigentlich auch zum Laufen kriegen, du kannst ja im Konstruktor mal gucken welche Größe das Array hat.


----------



## Juscho (9. Jun 2005)

jupp geht


----------

