# IMageIcon Bildgröße ändern



## Guest (19. Nov 2008)

Hallo,

ich habe hier ein ImageIcon, das in ein JPanel geladen wird.

Jetzt muss jedes Bild egal wie groß es eigentlich ist auf die Größe des JPanels angepasst werden.
Ich habe in der Api nur die Methode gefunden, um die größe des Bildes auszulesen nicht zu setzen.

WIe gelingt es mir jetzt, die Bildgröße auf die Größe des JPanels anzupassen???

Im MOment ist es so, dass wenn das Bild größer als das JPanel ist, dass er mir das Bild dann abschneidet, dass möchte ich aber verhindern.


----------



## Quaxli (19. Nov 2008)

Nimm statt ImageIcon ein BufferedImage (das Du über ImageIO einliest). BufferedImage hat eine Methode getScaledInstance(..) - die sollte das sein, was Du brauchst.


----------



## Guest (19. Nov 2008)

Quaxli hat gesagt.:
			
		

> Nimm statt ImageIcon ein BufferedImage (das Du über ImageIO einliest). BufferedImage hat eine Methode getScaledInstance(..) - die sollte das sein, was Du brauchst.



Habe noch nicht so viel Erfahrung, könntest Du mir vielleicht ein Beispiel hier rein schreiben??


----------



## Wolfgang Lenhard (19. Nov 2008)

Das effektivste wäre eigentlich, eine Klasse zu erstellen, die von JPanel oder was auch immer erbt, und an die man das Image übergibt. Anschließend muss die paintComponent-Methode überschrieben werden, die dann das Image auf die gesamte Fläche, oder wohin jeweils gewünscht zeichnet. Das ist performanter als die getScaledInstance-Methode:


> From the above results, it should be clear that the Graphics.drawImage()-based approaches are faster than, and at least as nice as (if not nicer than), Image.getScaledInstance(). By now I'm sure you're all scouring your code and looking to kick Image.getScaledInstance() to the curb once and for all. But remember, there is no one-size-fits-all approach to image scaling, and sometimes even a hybrid approach is best. Take, for example, an application that allows the user to drag the mouse to scale an image preview up and down. In this scenario, the user is unlikely to notice the scaling quality while the image is animating, so a one-step on the fly technique is probably best to keep things nimble. Once the user has stopped dragging, you might decide to use a multi-step "scaled instance" technique to update the area, to provide the highest-quality rendering.


 (siehe http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html )
Auf diese Weise würde auch bei Größenänderungen des JPanel das Bild korrekt gezeichnet werden.

Ciao,
   Wolfgang

P.S.: Wie man die paintComponent-Methode überschreibt ist auf der angegebenen Seite unter "On-The-Fly Scaling" beschrieben.


----------



## Wolfgang Lenhard (19. Nov 2008)

Und der Vollständigkeit halber hier ein wenig Code zum (umständlichen) Skalielieren eines ImageIcons:


```
public static ImageIcon scaleImageIcon(ImageIcon icon, int width, int height) {
      //BufferedImage erstellen, auf das gezeichnet wird
		BufferedImage bi = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_ARGB);
		Graphics g = bi.getGraphics();
		((Graphics2D) g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);

      //zeichnen
		g.drawImage(icon.getImage(), 0, 0, width, height, null);
		g.dispose();

      //neues ImageIcon erstellen und zurückliefern
      ImageIcon symbol = new ImageIcon();
		symbol.setImage(image);
		return symbol;
	}
```

Ciao,
  Wolfgang


----------



## Guest (19. Nov 2008)

Wolfgang Lenhard hat gesagt.:
			
		

> Und der Vollständigkeit halber hier ein wenig Code zum (umständlichen) Skalielieren eines ImageIcons:
> 
> 
> ```
> ...



Hallo Wolfgang, Ich glaube Du hast in Zeile 16 einen Fehler???

Woher nimmst Du bitte die Variable image??? Welche Variable soll da rein?? bi?? Icon????

Gruß


----------



## Wolfgang Lenhard (19. Nov 2008)

Oh, sorry! Ja, da muss bi rein. (ein Elend wie viele Fehler man macht, wenn man das einfach so ohne Unterstützung einer IDE tippt).


----------



## Guest (19. Nov 2008)

Funktioniert wunderbar danke


----------

