# Klasse Image - Höhe und Breite ermitteln



## Guest (5. Jun 2006)

Hallo,

kann mir hier jemand sagen wie ich die Breite und die Höhe eine Objektes vom Typ Image ermitteln kann.


Problem + Beispiel:

Image bild = Toolkit.getDefaultToolkit().getImage(absoluterPfad);

bild.getwidth(this); => wird nicht funktionieren da ich nicht in paint() bin und somit nicht this eintragen kann und ich hab auch kein ImageObserver.

ander möglichkeit:
bild.getwidth(nul); => funktioniert auch nicht so richtig, ich bekomme per zufall bei manchen bilder -1 zurück was das bedeutet könnt hier euch denken


Hab ihr eine Idee so teilt die mir bitte mit.
Danke.

Mit freundlichen Grüßen


----------



## L-ectron-X (5. Jun 2006)

> bild.getwidth(this); => wird nicht funktionieren da ich nicht in paint() bin und somit nicht this eintragen kann und ich hab auch kein ImageObserver.


Hast du's denn erst mal probiert, bevor du hier postest?
this ist eine Referenz auf die Klasse bzw. Objekt in der/dem du dich gerade befindest.
Diese Klasse kann die Aufgabe eines ImageObservers übernehmen.
Guck mal in die Java-API-Doc. Dort sind gleich ganz oben die Klassen aufgeführt, die das Interface implementieren.
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/image/ImageObserver.html


----------



## Gast (5. Jun 2006)

ja ich habe es schon probiert und die api habe ich mir auch schon angeschaut. das problem an der sache ist das ich nicht in der paint bin und somit auch nicht this benutzen kann. man kann nicht immer this benutzen, es kommt ganz darauf an wo man ist.


----------



## byte (5. Jun 2006)

Lies das Bild doch alternativ so ein:


```
BufferedImage bild = ImageIO.read(new File(absoluterPfad));
```

Dann kannst Du einfach bild.getWidth() und bild.getHeight() machen und bei Bedarf das ganze nach Image casten.


----------



## Gast (5. Jun 2006)

Bei dieser Variante wird doch das ganze Bild in den Speicher gelesen, das bedeutet viel Speicherverbrauch oder?


----------



## Gast (8. Jun 2006)

weiß es keiner?


----------



## willi (8. Jun 2006)

schon mal mit:


```
Image img = Toolkit.getDefaultToolkit().createImage(<absoluterPfad>);
```

versucht? 

und dann mit: 
	
	
	
	





```
img.getWidth(null);
```

probiers mal...


----------



## Gast (8. Jun 2006)

Hallo willi,
danke für die Antwort.
Diese Idee ist mir auch eingefallen, aber es ergibt sich das selbe wie getImage(). Ich bekomme per zufall bei manchen bilder -1 zurück, ich hab es nochmal getestet - aber natürlich ändert sich nichts von gestern auf heute. 
Wieso es mit null als Parameter nur machmal funktioniert kann ich mir auch nicht erklären. Leider.


----------



## Illuvatar (8. Jun 2006)

also a) das ImageIO braucht genauso viel Speicher wie das andere, das Bild muss ja eh immer im Speicher sein, wie soll das sonst gezeichnet werden?
b) wieso zur Hölle sollte in paint() this nicht gehen? Ich kann mir nur einen Fall vorstellen wo es kein this gibt, und das wäre eine static Methode


----------



## Gast (9. Jun 2006)

Hallo leute,
ich muss mal erlich sagen das dieses Forum irgendwie komisch ist. Nicht eine Person aber nur eine hat hier mehr als einmal gepostet, wenn man nur eine kleine zusatzfrage hat dann wird die nie beantwortet. So kann man echt kein Problem lösen, wirklich nicht. Wenn immer wieder eine neue Person kommt und man immer wieder alles neu erklären muss und kein schritt weiter kommt, dann nervt das auch mal.

@Illuvatar
a) es muss nicht immer alles eingelesen werden, es kann sich auch nur eine referenz darauf beziehen. denn im jedem bild steht die eigenschaften eines bildes, die hohe und breite auch!

b) wer lesen kann ist klar im vorteil, leider muss ich mich hier immer wiederholen: das problem ist das ich nicht, ich wiederhole nicht in paint bin, also kann auch this in meinen fall nicht funktionieren. Ich habe nie gesagt das this in paint nicht funktioniert ....


----------



## Illuvatar (9. Jun 2006)

Ui, ich antworte zum zweiten Mal (was ist da jetzt so besonderes dran?):

also: du hast Recht, dass du nicht in paint bist, das hast du gesagt, da hab ich mich verlesen.

ansonsten ist das Problem, denke ich, dass das Toolkit#getImage (oder auch create) die Bilder eben nur asynchron lädt, d.h. wenn du getWidth(null) aufrufst ist die Größe unbekannt (laut API bedeutet -1 auch not _yet_ known).
Demnach hast du 2 Möglichkeiten:
a) Einen MediaTracker verwenden und mit Hilfe von diesem warten, bis das Bild geladen ist. (->Forensuche)
b) Das mit ImageIO (das lädt das Bild sofort)
Diese beiden Möglichkeiten sind ziemlich gleichwertig. Dein Argument "es muss nicht immer alles eingelesen werden" verstehe ich nicht wirklich, dein getImage liest genausoviel ein wie ImageIO.read. Wenn du nur einen Teil der Datei lesen willst, kannst du das auch selber per FileReader machen, ich glaube aber kaum, dass sich der Aufwand lohnt. Falls du das Bild öfter brauchst, ist es auf jeden Fall nützlicher, irgendwo eine Referenz darauf zu haben. (Und dann am Besten per createImage laden, da dann die Bilddaten nicht im Cache gehalten werden)


----------



## Roar (9. Jun 2006)

ich glaub du suchst sowas:

```
File f = new File("großesBild.jpeg");
		ImageInputStream is = ImageIO.createImageInputStream(f);
		Iterator<ImageReader> readers = ImageIO.getImageReaders(is);
		if(!readers.hasNext())
			throw new RuntimeException("nix jpeg");
		ImageReader r = readers.next();
		r.setInput(is);
		int width = r.getWidth(0);
		int height = r.getHeight(0);
```
:?:


----------



## Gast (10. Jun 2006)

Hallo Leute,
ok ich glaube ich weiß wie ich das ganze in meiner schleife einbauen muss. Ich teste das einfach mal. Ich sag dann mal auch bescheid. 
Ich Danke euch allen.


PS: Das ganze kann aber auch dauern ... 

Mit freundlichen Grüßen
Hans Peter und Wurst


----------

