# image skalieren



## diggaa1984 (15. Sep 2009)

hiho, 

in etwa war mir ja klar wie man images skalieren kann, was rein größentechnisch auch klarppt, nur seh ich nich das bild sondern einfach ne graue fläche. Das Image liegt als 16x16 vor und soll kleiner skaliert werden. Das ganze wollte ich derart lösen:


```
private class ScaledImageTabButton extends JButton {
				
	/** */
	private static final long serialVersionUID = -5639648137402210321L;

			
	public ScaledImageTabButton(Action a, int dimension) {
		super(a);
		Object icon = a.getValue(Action.SMALL_ICON);
		if (icon != null)
			setIcon(scaleIcon((Icon) icon,dimension, dimension));
			
		setContentAreaFilled(false);
		setFocusable(false);
	}//constructor
			
			
	private Icon scaleIcon(Icon i, int width, int height) {
		BufferedImage bi = new BufferedImage(i.getIconWidth(),i.getIconHeight(),BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d = (Graphics2D) bi.getGraphics();
		g2d.drawImage(((ImageIcon) i).getImage(), 0, 0, null);
		return new ImageIcon(bi.getScaledInstance(width, height, BufferedImage.SCALE_DEFAULT));
	}//scaleIcon
}//ScaledImageTabButton
```

nur seh ich da nur ne dunkelgraue fläche 
Die Grafik hier unten zeigt das Original, welches ich unverändert in der Toolbar verwende.


----------



## hdi (15. Sep 2009)

Versuch's mal mit createGraphics(), getGraphics() ist veraltet. Wobei ich echt nicht weiss, ob's daran liegt. Kenn mich damit auch nicht so aus, aber falls dir das etwas hilft, hier mal funktionierender Code, der allerdings etwas anders aussieht weil er ein Bild auf ein Panel zeichnet:


```
BufferedImage bsrc = ImageIO.read(sourceFile);
					BufferedImage bdest = new BufferedImage(width, height,
							BufferedImage.TYPE_INT_RGB);
					Graphics2D g = bdest.createGraphics();
					AffineTransform at = AffineTransform.getScaleInstance(
							(double) width / bsrc.getWidth(), (double) height
									/ bsrc.getHeight());
					g.drawRenderedImage(bsrc, at);
```


----------



## Geeeee (15. Sep 2009)

Warum nicht Folgendes:

```
ImageIcon originalIcon = new ImageIcon(IconTest.class.getResource("/bild.png"));
ImageIcon smallIcon = new ImageIcon(originalIcon.getImage().getScaledInstance(8, 8, Image.SCALE_SMOOTH));
```
Oder erkenne ich das Problem nicht richtig?
EDIT:
Ok, sehe gerade erst, dass du dich auf das Icon-Interface beziehst. Natürlich ist meine Lösung nur für ImageIcon möglich.


----------



## Der Müde Joe (15. Sep 2009)

ohne alles gelesen zu haben:
The Perils of Image.getScaledInstance() | Java.net


----------



## diggaa1984 (15. Sep 2009)

Geeeee hat gesagt.:


> Warum nicht Folgendes:
> 
> ```
> ImageIcon originalIcon = new ImageIcon(IconTest.class.getResource("/bild.png"));
> ...



hm mach ich was schwerwiegend falsch wenn ich mein Icon in ein ImageIcon caste, weil das klappt


----------



## Der Müde Joe (15. Sep 2009)

das klappt bei mir wunderbar:


```
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;


public class FF extends JFrame {

	public FF(BufferedImage image) {
		JButton button = new BButton(image, 40);
		getContentPane().add(button);
		setSize(200, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	static class BButton extends JButton {

		public BButton(BufferedImage image, int dimesion) {
			setIcon(new ImageIcon(getScaledInstance(image, dimesion, dimesion,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR, true)));
			setContentAreaFilled(false);
	        setFocusable(false);

		}

		public static BufferedImage getScaledInstance(BufferedImage img, int targetWidth,
				int targetHeight, Object hint, boolean higherQuality) {
			int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB
					: BufferedImage.TYPE_INT_ARGB;
			BufferedImage ret = img;
			int w, h;
			if (higherQuality) {
				w = img.getWidth();
				h = img.getHeight();
			} else {
				w = targetWidth;
				h = targetHeight;
			}
			do {
				if (higherQuality && w > targetWidth) {
					w /= 2;
					if (w < targetWidth) {
						w = targetWidth;
					}
				}
				if (higherQuality && h > targetHeight) {
					h /= 2;
					if (h < targetHeight) {
						h = targetHeight;
					}
				}
				BufferedImage tmp = new BufferedImage(w, h, type);
				Graphics2D g2 = tmp.createGraphics();
				g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
				g2.drawImage(ret, 0, 0, w, h, null);
				g2.dispose();
				ret = tmp;
			} while (w != targetWidth || h != targetHeight);
			return ret;
		}
	}

	public static void main(String... args) throws IOException {
		BufferedImage image = ImageIO.read(new File("1.gif"));
		new FF(image);
	}
}
```


----------

