image skalieren

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
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:

Java:
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.
 
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:

Java:
					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);
 
Warum nicht Folgendes:
Java:
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.
 
Warum nicht Folgendes:
Java:
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.

hm mach ich was schwerwiegend falsch wenn ich mein Icon in ein ImageIcon caste, weil das klappt 😵
 
das klappt bei mir wunderbar:

Java:
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);
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben