AffineTransform (perspektivische Verzerrung für sic h öffnende Tür)
Von: The Pianoman (thepianoman@nurfuerspam.de) [Profil]
Datum: 25.10.2009 14:23
Message-ID: <6418d412-059c-487e-877e-e90d50919038@m25g2000vbi.googlegroups.com>
Newsgroup: de.comp.lang.java
Datum: 25.10.2009 14:23
Message-ID: <6418d412-059c-487e-877e-e90d50919038@m25g2000vbi.googlegroups.com>
Newsgroup: de.comp.lang.java
Hallo,
ich will eine sich öffnende Tür / Schublade / Schrank etc. darstellen,
habe aber noch ein Problem.
Bsp.: http://www.gif-star.com/gegenstaende/tueren/42320005.gif
Mein Ansatz: Ich verzerre mittels das Bild mittels
1) AffineTransform.shear(0.0, 0.3), Verzerrung der Y-Achse von oben
nach unten,
dann nehme ich das bereits verzerrte Bild und mache ein
2) AffineTransform.shear(0.0, -0.3), Verzerrung der Y-Achse von unten
nach oben
Klappt aber leider nicht. Und es gibt bestimmt eine einfachere Lösung
mit einer
einzelnen Transformation, statt mit zweien.
Hier ein Code-Beispiel:
class MyFrame extends JFrame {
try {
imgBg = ImageIO.read(getClass().getResourceAsStream("door0.gif"));
} catch (Exception e) {}
// 1) Bild wird wie gewünscht verzerrt, weist aber unschöne Artefakte
auf
AffineTransform at = AffineTransform.getShearInstance(0.0, 0.3);
BufferedImage imgShear1 = new BufferedImage(imgBg.getWidth(),
imgBg.getHeight(), imgBg.getType());
Graphics2D g2d = (Graphics2D)imgShear1.getGraphics();
g2d.drawImage(imgBg, at, null);
// 2) Nimm das verzerrte Bild und wende wiederum shear() darauf an,
klappt leider nicht
AffineTransform at2 = AffineTransform.getShearInstance(0.0, -0.3);
BufferedImage imgShear2 = new BufferedImage(imgBg.getWidth(),
imgBg.getHeight(), imgBg.getType());
g2d = (Graphics2D)imgShear2.getGraphics();
g2d.drawImage(imgShear1, at2, null);
JButton btnBg1 = new JButton(new ImageIcon(imgShear1)); // ok, bis auf
die Bildqualität (Artefakte)
getContentPane().add(btnBg1);
JButton btnBg2 = new JButton(new ImageIcon(imgShear2)); // fehlerhaft,
warum wird nur in eine Richtung verzerrt?
getContentPane().add(btnBg2);
pack();
setVisible(true);
}
Hat jemand eine Lösung, bzw. passende Transformation?
Danke und Gruß
Bernd
PS: Im obigen Bsp. treten unschöne Artefakte auf, die nicht auftreten,
wenn ich
direkt Graphics.paint() überschreibe. Weiß jemand, warum das so ist?
public void paint(Graphics g) {
AffineTransform at = AffineTransform.getShearInstance(0.0, 0.3);
//at.concatenate(new AffineTransform());
//at.concatenate(AffineTransform.getShearInstance(0.0, -0.3));
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(imgBg, at, null); // Bild wird sauber (ohne Artefakte)
gezeichnet
}
[ Auf dieses Posting antworten ]Antworten
- Marcus Woletz (25.10.2009 22:53)
- Bernhard (25.10.2009 22:40)
- Marcus Woletz (26.10.2009 22:05)
- Bernhard (26.10.2009 21:54)
- Sven Köhler (26.10.2009 00:05)
- Sven Köhler (26.10.2009 14:20)
- Bernhard (26.10.2009 17:11)
- Sven Köhler (26.10.2009 17:44)
- Jochen Theodorou (26.10.2009 20:06)
