public void update(Graphics g) { g2d = (Graphics2D) g; // Y-ACHSE IN REAL-KOORDINATEN TRANFORMIEREN AffineTransform yUp = new AffineTransform(); yUp.setToScale(1, -1); AffineTransform translate = new AffineTransform(); translate.setToTranslation(0, bi.getHeight() * 2); yUp.preConcatenate(translate); // Umwandlung der Y-Achse auf g2d anwenden. g2d.transform(yUp); // Erzeugt ein neues BufferedImage biUp, auf welches gezeichnet werden // kann. // Es bekommt die doppelte Höhe vom BufferedImage bi, da dieses auf die // doppelte Höhe gestreckt werden soll. // Die Breite wird übernommen vom BufferedImage bi, da diese nicht // geändert // werden soll. BufferedImage biUp = new BufferedImage(bi.getWidth(), 2 * bi.getHeight(), BufferedImage.TYPE_INT_RGB); // Variablen für die Berechnung der Geraden, entlang welcher das Bild // gestreckt wird. // // m: STEIGUNG DER GERADEN: (Y2-Y1 / X2-X1) (Punkte: P1: (Anfang der // Geraden unten links) P2: (Ende der Geraden oben rechts) ) float m = ((float) (biUp.getHeight() - bi.getHeight()) / (bi.getWidth() - 0)); // n: STARTHÖHE DER GERADEN int n = bi.getHeight(); // SCHLEIFE ZUM BERECHNEN DES GESTRECKTEN BILDES // // Zählt nur bis Pixel Width-1 und Height-1, da getRGB sonst einen // Fehler ausgibt. // Bsp.: Bild mit Auflösung 512x384 wird nur bis 511x383 ausgelesen. // // ANM.: Tauscht man Y und X in den FOR-Schleifen (inkl. Height + Width) // wird das Bild entweder von // links nach rechts ODER von unten nach oben gezeichnet // Y wird runtergezählt bis zum obersten Pixel (runter, da in Java die // Y-Achse von oben nach unten geht) for (int y = bi.getHeight()-1; y >= 0; y--){ // Y wird hochgezählt bis zum obersten Pixel// for (int y = 0; y <= bi.getHeight() - 1; y++) { // X wird hochgezählt bis zum rechtesten Pixel// for (int x = bi.getWidth()-1; x >= 0; x--){ for (int x = 0; x <= bi.getWidth() - 1; x++) { // Auslesen des RGB-Wert aus dem aktuellen Pixel des // Original-Bildes Color orgColor = new Color(bi.getRGB(x, y)); // GERADENGLEICHUNG ZUR BERECHNUNG DER HÖHE BIS ZU DER // GEZEICHNET WERDEN SOLL // uepsilon ist die Hoehe, bis zu der das gestreckte Bild // gezeichnet wird. float uepsilon = (m * x + n); // GIBT AN, WIE OFT DIE PIXEL MULTIPLIZIERT WERDEN // z.B. rechteste Linie: hoehenMultiplikator = 2, da Bildgrösse // verdoppelt wird. float hoehenMultiplikator = (float) (uepsilon / (bi.getHeight())); // Überprüft, ob mit hoehenMultiplikator multiplizierter Y-Wert // im Bild liegt // // Grund: // Da bei der Berechnung der Höhe eine Fließkommazahl auf eine // ganze Zahl gecastet wird, kann es passieren, dass der Wert // über die Höhe des Bildes hinausgeht! // Höhe-1, da Pixel y+1 sonst übers Bild hinausgeht. if ((int) (hoehenMultiplikator * y) < biUp.getHeight() - 1) { // Zeichnen der aktuell gestreckten Pixel-Reihe in biUp // hoehenMultiplikator gibt den Grad der Streckung an. // Damit, keine Lücken beim Zeichnen entstehen, wird der // jeweilige Pixel 1 nach oben kopiert. // // Anm.: Bild wird verkehrt herum gezeichnet, durch das spätere // Umdrehen der Y-Achse wird das aber wieder behoben. biUp.setRGB(x, ((int) ((bi.getHeight() - 1 - y) * (hoehenMultiplikator))), orgColor.getRGB()); biUp.setRGB(x, ((int) ((bi.getHeight() - 1 - y) * (hoehenMultiplikator))) + 1, orgColor.getRGB()); } // Zeichnet das Bild Pixel für Pixel // g2d.drawImage(biUp, 0, bi.getHeight(), null); // g2d.drawImage(biUp, 0, 0, null); g2d.drawImage(biUp, 8, -30, null); } // Zeichnet das Bild Linie für Linie nach jedem Schleifen-Durchlauf// g2d.drawImage(biUp, 0, 0, null); // g2d.drawImage(biUp, 0, bi.getHeight(), null);// g2d.drawImage(biUp, 8, -30, null); } // endFOR // Zeichnet das fertig gestreckte Bild komplett. // (x=8, y=-30 , damit das Bild nicht über den Rand gezeichnet wird.// g2d.drawImage(biUp, 8, -30, null); // g2d.drawImage(biUp, 0, bi.getHeight(), null); } // end of update()