# Image laden funktioniert nicht!



## acky (19. April 2005)

folgender code führt zu der fehlermeldung:

*java.lang.ClassCastException: sun.awt.image.ToolkitImage
	at spincontrol.Start.<init>(Start.java:68)
	at spincontrol.Start.main(Start.java:115)
Exception in thread "main" java.lang.NullPointerException
	at spincontrol.Start.<init>(Start.java:79)
	at spincontrol.Start.main(Start.java:115)
Bild konnte nicht geladen werden!
Cause: null
Message: java.lang.ClassCastException: sun.awt.image.ToolkitImage
Class: class java.lang.ClassCastException
---------------------------------------------*

kann mir jemand sagen, warum?!  auch bei absolut / vollständiger pfadangabe.
(ausdokumentierte version klappt, leider aber auch nicht überall!)

danke,
acky


```
Image image;
		try {
			//img = (BufferedImage) 
                        //   new ImageIcon(ImageIO.read(getClass().
                        //        getResource("startscreen.bmp")) ).getImage();
			image = getToolkit().getImage("startscreen.bmp");
			img = (BufferedImage) image;
		} catch (Exception e1) {
			System.out.println("Bild konnte nicht geladen werden!");
			System.out.println("Cause: " + e1.getCause() );
			System.out.println("Message: " + e1.toString() );
			System.out.println("Class: " + e1.getClass() );
			System.out.println("---------------------------------------------");
			e1.printStackTrace();
		}
```


----------



## Thomas Darimont (20. April 2005)

Hallo!

getToolkit().getImage(...) liefert auf ein Image und kein BufferedImage.
Verwende besser die read(..) Methode der Klasse ImageIO um Bilder zu laden.

Gruß Tom


----------



## acky (20. April 2005)

Thomas Darimont hat gesagt.:
			
		

> Hallo!
> 
> getToolkit().getImage(...) liefert auf ein Image und kein BufferedImage.
> Verwende besser die read(..) Methode der Klasse ImageIO um Bilder zu laden.
> ...



mit der read(..) Methode der Klasse ImageIO (siehe ausdokumentierte zeilen) klappt es bei mir, leider nicht auf dem system, auf dem es laufen soll! (java-version < 1.5 - denke, da könnte das problem liegen)
daher suche ich eine alternative möglichkeit aus einer auf der festplatte existierenden bild-datei ein bufferedImage zu erzeugen bzw. zu casten - aber das funktioniert bei mir nicht so wie geplant, eben in puncto typecast versteh ich die fehlermeldungen nicht.


----------



## Thomas Darimont (21. April 2005)

Hallo!

Die Klasse ImageIO gabs auch schon unter 1.4 ;-)

Wenn du trotzdem mit Toolkit....getImage(...) arbeiten musst, dann lade einfach mit Toolkit....getImage(...) ein Bild un speichere es in einem Image zwischen.
Anschließend erstellst du ein neues BufferedImage:
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
danach zeichnes du das ursprüngliche Image einfach ins BufferedImage...
bi.getGraphics().drawImage(image);
fertig.

Gruß Tom


----------



## acky (21. April 2005)

Thomas Darimont hat gesagt.:
			
		

> Hallo!
> 
> Die Klasse ImageIO gabs auch schon unter 1.4 ;-)
> 
> ...



das kompilieren unter jdk 1.4 hat auch funktioniert - doch die ausführung hat halt fehlermeldungen erzeugt.
brauch das bufferedImage u.a. dazu, die größe des bildes zu ermitteln - bekomme aber nach wie vor kein bufferedImage erzeugt. 
die notlösung, schlicht über eine Image zu gehen:


```
Image i = Toolkit.getDefaultToolkit().getImage(path);
if( i == null) { System.out.println("null"); }
this.prepareImage(i, this);
w = i.getWidth(this);
h = i.getHeight(this);
System.out.println("Höhe: " + h + " - Breite : " + w );
```

ergibt eine höhe und breite von -1 - obwohl i != null ...

bis nen bisschen ratlos grad, weil ich keine ahnung hab, warum es so nicht .
bin für jeden tipp dankbar!

acky


----------



## Thomas Darimont (21. April 2005)

Hallo!

Das liegt daran, dass das Image von Toolkit...getImage(...) nicht vollständig geladen wird.
Verwende einen MediaTracker um sicherzustellen,dass das Image vor dem Zugriff komplett geladen ist. Aber wie gesagt das ist "veraltete" Technik...

Gruß Tom


----------



## acky (21. April 2005)

Thomas Darimont hat gesagt.:
			
		

> Hallo!
> 
> Das liegt daran, dass das Image von Toolkit...getImage(...) nicht vollständig geladen wird.
> Verwende einen MediaTracker um sicherzustellen,dass das Image vor dem Zugriff komplett geladen ist. Aber wie gesagt das ist "veraltete" Technik...
> ...




```
i = Toolkit.getDefaultToolkit().getImage(path);
MediaTracker mt = new MediaTracker(this);
mt.addImage(i,0);

while( !mt.checkID(0) ) {
      mt.waitForID(0);
}
System.out.println( mt.getErrorsAny().toString() );
			
if( i == null) { System.out.println("null"); }
w = i.getWidth(this);
h = i.getHeight(this);
System.out.println("Höhe: " + h + " - Breite : " + w );
```

so klappt das auch nicht, was mach ich diesmal falsch?


----------



## Thomas Darimont (21. April 2005)

Hallo!

Funktioniert bei mir einwandfrei:

```
/**
 * 
 */
package de.tutorials.training;

import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;

import javax.swing.JFrame;

/**
 * @author Darimont
 * 
 */
public class ImageDimensionExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		Image img = Toolkit.getDefaultToolkit().createImage("C:/panda.png");

		//Dummy Frame
		JFrame frm = new JFrame(); 
		//Innerhalb einer Component natürlich this... statt frm
		MediaTracker mt = new MediaTracker(frm);
		mt.addImage(img, 0);
		mt.waitForAll();

		System.out.println(img.getWidth(frm));
		System.out.println(img.getHeight(frm));
	}
}
```

Gruß Tom


----------

