BastianX75
Grünschnabel
Hallo
ich habe hier ein Problem beim Skalieren von Bildern.
Die Funktion Image.getScaledInstance() liefert sehr gute Ergebnisse, aber ist leider viel zu langsam. Also bin ich auf die RenderingHints umgestiegen. Das funktioniert auch super, hat nur leider einen Schönheitsfehler bei Java-Versionen < 1.6
An Kanten zu einem transparenten Hintergrund wird beim Skalieren aus irgend einem Grund der Farbton verändert. Bei getScaledInstance() und NEAREST_NEIGHBOR passiert das nicht.
Ich hab mal ne kleine Demo geschrieben und die Ausgabe angehängt, damit ihr wisst was ich meine.
Hat jemand von euch ne Idee, wie ich das wegbekomme? Ich komm einfach nicht mehr weiter
Gruß Bastian
ich habe hier ein Problem beim Skalieren von Bildern.
Die Funktion Image.getScaledInstance() liefert sehr gute Ergebnisse, aber ist leider viel zu langsam. Also bin ich auf die RenderingHints umgestiegen. Das funktioniert auch super, hat nur leider einen Schönheitsfehler bei Java-Versionen < 1.6
An Kanten zu einem transparenten Hintergrund wird beim Skalieren aus irgend einem Grund der Farbton verändert. Bei getScaledInstance() und NEAREST_NEIGHBOR passiert das nicht.
Ich hab mal ne kleine Demo geschrieben und die Ausgabe angehängt, damit ihr wisst was ich meine.
Hat jemand von euch ne Idee, wie ich das wegbekomme? Ich komm einfach nicht mehr weiter
Gruß Bastian
Code:
package test;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.RenderingHints.Key;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MainFrame2 extends JFrame {
private static final long serialVersionUID = 4139263702195707270L;
Image scaleImg;
Image backImg;
public MainFrame2(String title) throws HeadlessException {
super(title);
Container c = getRootPane().getContentPane();
c.setLayout(new GridLayout(0, 2, 5, 5));
scaleImg = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);;
Graphics2D g2 = (Graphics2D)scaleImg.getGraphics();
Polygon p = new Polygon(new int[]{100, 200, 100, 0}, new int[]{0, 100, 200, 100}, 4);
g2.setColor(Color.cyan);
g2.fillPolygon(p);
g2.setColor(Color.blue);
g2.setFont(new Font("Helvetica", 0, 24));
g2.drawString("scaled Image", 30, 108);
g2.dispose();
backImg = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);;
g2 = (Graphics2D)backImg.getGraphics();
g2.setColor(Color.cyan);
g2.fillRect(0, 0, 100, 100);
g2.setColor(Color.blue);
g2.fillRect(20, 20, 60, 60);
g2.dispose();
Image img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);;
g2 = (Graphics2D)img.getGraphics();
g2.drawImage(backImg, 0, 0, null);
g2.drawImage(scaleImg.getScaledInstance(100, 100, Image.SCALE_AREA_AVERAGING), 0, 0, null);
g2.drawImage(img, 0, 0, null);
g2.dispose();
c.add(getLabel("getScaledInstance"));
c.add(new JLabel(new ImageIcon(img)));
c.add(getLabel("NEAREST_NEIGHBOR"));
c.add(new JLabel(new ImageIcon(
getScaled(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR))));
c.add(getLabel("BILINEAR"));
c.add(new JLabel(new ImageIcon(
getScaled(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR))));
c.add(getLabel("BICUBIC"));
c.add(new JLabel(new ImageIcon(
getScaled(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC))));
c.add(getLabel("RENDER_QUALITY"));
c.add(new JLabel(new ImageIcon(
getScaled(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY))));
}
private Image getScaled(Key key, Object obj) {
Image img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D)img.getGraphics();
g2.setRenderingHint(key, obj);
g2.drawImage(backImg, 0, 0, null);
g2.drawImage(scaleImg, 0, 0, 100, 100, null);
g2.dispose();
return img;
}
private JLabel getLabel(String text) {
JLabel l = new JLabel(text);
l.setFont(new Font("Helvetica", 0, 12));
return l;
}
public static void main(String[] args) {
MainFrame2 main = new MainFrame2("Scalingtest: "+System.getProperty("java.version"));
main.setDefaultCloseOperation(EXIT_ON_CLOSE);
main.pack();
main.setVisible(true);
}
}