Graphics.drawImage() - Output-Größe entspricht nicht Parametern

lyrichter

Mitglied
Hallo!

Nachdem mein erstes Problem bei der GUI-Entwicklung hier sehr schnell und kompetent gelöst wurde, tritt schon wieder ein sehr merkwürdiger Effekt auf, den ich nicht verstehe:

Nach dem Aufruf von g2.drawImage(sourceImg,0,0,400,400,x1,y1,x2,y2,null) erhalte ich kein quadratisches Bild, sondern das Bild ist in Y-Richtung mit Faktor 2 gestaucht. Da dieser Effekt absolut zuverlässig für alle Eingabewerte auftritt, behebt ein Korrekturfaktor 2 das Problem schon - allerdings ist das natürlich nicht das Mittel der Wahl.

Auch nach längerer Fehlersuche und etwas Recherche kann ich die Quelle für dieses merkwürdige Verhalten nicht ausfindig machen - wahrscheinich übersehe ich einfach etwas Offensichtliches. Für Hinweise wäre ich sehr dankbar!

Schonmal vielen Dank für's Lesen - nachfolgend der zugehörige Code und im Anhang ein Screenshot des Ergebnisses:


Java:
public class MyPanel extends JPanel{
    BufferedImage buffImg;
    Point upperLeft;
    int width;
    int height;
    
    public MyPanel(){
        super();
        
        //load Image
        File f = new File("images/test.jpg");
        try {
            buffImg = ImageIO.read(f);
        } catch (IOException e) {
            System.out.println("Datei konnte nicht geöffnet werden!");
        }
        
        // initial values
        upperLeft = new Point(0,0);
        width = buffImg.getWidth();
        height = buffImg.getHeight();
        
        repaint();
    }
    
    @Override
    protected void paintComponent( Graphics g )
      {
        super.paintComponent(g);
        
        int a = (int) upperLeft.getX();
        int b = (int) upperLeft.getY();
        int c = a+width;
        int d = b+height;
                
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(buffImg,0,0,400,400,a,b,c,d, null);
        }
}
 
 
 
public class Test {
    
    public static void main(String[] args){
        // frame
        JFrame frame = new JFrame("test");
        frame.setSize(1000, 1000);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLayout( new FlowLayout() );
        
        //picPanel
        MyPanel picPanel = new MyPanel();
        picPanel.setPreferredSize(new Dimension(400,400));
        picPanel.setBorder(BorderFactory.createTitledBorder("picPanel"));
        
        //picBorderPanel
        JPanel picBorderPanel = new JPanel ();
        picBorderPanel.setPreferredSize(new Dimension(500,500));
        picBorderPanel.setBorder(BorderFactory.createTitledBorder("picBorderPanel"));
        picBorderPanel.add(picPanel);
        
        //buttonPanel
        JPanel buttonPanel = new JPanel();
        buttonPanel.setPreferredSize(new Dimension(500,500));
        buttonPanel.setBorder(BorderFactory.createTitledBorder("buttonPanel"));
        
        // adding components to top level container
        Container contentPane = frame.getContentPane();
        contentPane.add(picBorderPanel);
        contentPane.add(buttonPanel);
        
        // set visible
        frame.pack();
        frame.setVisible(true); 
    }
}
 

GUI-Programmer

Top Contributor
Da es sich bei deinem Bild um ein .jpg handelt, vermute ich einfach mal, dass in Zeile 13 (
Code:
buffImg = ImageIO.read(f);
ein Cast von einem "normalen" java.awt.Image zu einem BufferredImage durchegeführt wird, der evtl. nicht richtig funktioniert. Ändere daher mal den Typ von buffImg zu Image. Oder lade ein Image, welches du dann in deinem BufferredImage zeichnest.
 

lyrichter

Mitglied
Hmm, laut Methodenkopf gibt ImageIO.read(f) aber doch sowieso ein BufferedImage zurück

Java:
public static BufferedImage read(File input) throws IOException

und hier heißt es auch, dass das JPG-Format unterstützt wird.

Sehe ich das falsch?
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Und wie ich dir im letzten Thread schon gesagt habe, ist es viel einfacher drawImage(image,0,0,400,400,null) zu schreiben um ein quadratisches Bild zu malen (hier wird das bild gestaucht/gedehnt). Wenn du einen Ausschnitt aus dem Bild zeichnen willst, musst du statt deinen abcd nicht die Maße des Image nehmen, sondern ebenfalls 0,0,400,400.
 

lyrichter

Mitglied
Erstmal danke für eure Mühen, auch nochmal an GUI-Programmierer :)

Aber das ist ja echt merkwürdig...hast du denn auch eine JPG-Datei benutzt? Und hatte das Bild auch schon vor der Skalierung ein quadratisches Format?

Meine Datei Test.jpg war in der Tat schon vorher quadratisch mit den Maßen 1600x1600 Pixel.

Ich bin erstmal ratlos. Zur Sicherheit werde ich gleich nochmal mein Code mit dem geposteten Vergleichen, vielleicht hat sich bei mir in der Zwischenzeit ein Flüchtigkeitsfehler eingeschlichen...

Edit:
@bERT0r:
Der Aufruf ist alleine in diesem Kontext tatsächlich etwas umständlich. Ich habe allerdings diese Vorgehensweise gewählt, da ich diese Architektur später noch benötige. upperLeft, width und heigth werden später verändert und speichern somit nicht mehr nur die Koordinaten für das ganze Bild, sondern für einen gewünschten Ausschnitt. Dieser wird dann auf die passende Größe skaliert und gezeichnet.
 
S

Spacerat

Gast
Mal unabhängig davon, was es für ein Imageformat ist (das ist definitiv nicht der Fehler, zumal das Bild ja angezeigt wird), hast du mal ausprobiert, ob es was bringt, Source- und Destinationkoordinaten (also sx usw mit dx usw) zu vertauschen? Wer weis, von welcher Warte aus Sun Source und Destination sieht bzw. gesehen hat. Immerhin könnte mit Destination ja der Ausschnitt der eigentlichen Source gemeint sein, welcher letztendlich (Destination) als Source des zu zeichnenden Vierecks dient. Hoffe ihr versteht was ich sagen will, obwohl ich versteh's ja selber kaum. ;)
 

jgh

Top Contributor
mmmh, also dein Code liefert sowohl bei ursprünglich quadratischen Bildern, als auch bei jeglichen anderen Format ein quadratisches Bild zurück.

Dein KSKB liefert auch ein "in Y-Richtung mit Faktor 2 gestauchtes" Bild...??? Kann ich mir nicht vorstellen...
 

lyrichter

Mitglied
So, das Problem hat sich erledigt. Mein gepostetes KSKB läuft wunderbar, auch wenn ich absolut keinen Unterschied zu der Variante auf meinem PC feststellen konnte. Muss irgendein ganz unscheinbarer Tippfehler gewesen sein.
Auf dem korrekten KSKB aufgauend habe ich nun nochmal vo vorne programmiert und jetzt läuft es.

Vielen Dank für's Ausprobieren!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
K Graphics.drawImage() sehr schnell AWT, Swing, JavaFX & SWT 5
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
B Graphics to Image AWT, Swing, JavaFX & SWT 3
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
M Graphics.fillOval AWT, Swing, JavaFX & SWT 1
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
vodkaz Graphics aufrufen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
M JFrame Graphics.drawString Problem AWT, Swing, JavaFX & SWT 11
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
R Ankerpunkt bei Graphics AWT, Swing, JavaFX & SWT 3
R Fließende Bewegung von Graphics AWT, Swing, JavaFX & SWT 6
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
P "Graphics" wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
T Graphics zeichnet nicht AWT, Swing, JavaFX & SWT 2
T Applet graphics - zeichnen funktioniert nicht AWT, Swing, JavaFX & SWT 14
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
S Zeichnen mit java.awt.Graphics AWT, Swing, JavaFX & SWT 6
D Graphics zeichnen AWT, Swing, JavaFX & SWT 6
M Graphics auf JFrame Koordinatensystem AWT, Swing, JavaFX & SWT 3
T Graphics Ersetzend Zeichnen AWT, Swing, JavaFX & SWT 6
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
T Graphics Parameterübergabe AWT, Swing, JavaFX & SWT 3
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
S Swing AWT (graphics (g)) AWT, Swing, JavaFX & SWT 27
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
B Swing Tooltips auf Graphics AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
E Problem bzw. Sinn von Graphics / Graphics Context AWT, Swing, JavaFX & SWT 21
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
S Mit Graphics g ins Fenster zeichnen AWT, Swing, JavaFX & SWT 4
G Graphics - Raute AWT, Swing, JavaFX & SWT 3
G "pinseldicke" bei Graphics? AWT, Swing, JavaFX & SWT 2
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
L Graphics AWT, Swing, JavaFX & SWT 37
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
Y Problem mit der Referenz eines Graphics-Objekts AWT, Swing, JavaFX & SWT 5
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
K Gutes Buch gesucht (Graphics Only) Kennt jemand eins? AWT, Swing, JavaFX & SWT 5
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
E Image, Graphics, verzögert zeichnen AWT, Swing, JavaFX & SWT 2
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10
G SWT Graphics Zeichnung neu laden AWT, Swing, JavaFX & SWT 13
G SWT Graphics GC Problem AWT, Swing, JavaFX & SWT 6
M Abstrakte Graphics Klasse erzeugen AWT, Swing, JavaFX & SWT 2
H awt Graphics und Image selbermachen ? AWT, Swing, JavaFX & SWT 12
D Image aus Graphics erstellen? AWT, Swing, JavaFX & SWT 2
R Graphics Objekt ändern AWT, Swing, JavaFX & SWT 11
raptorrs J2D graphics, sind 500px immer 500 px AWT, Swing, JavaFX & SWT 2
G Graphics AWT, Swing, JavaFX & SWT 2
H Graphics: Schriftgröße ändern AWT, Swing, JavaFX & SWT 4
X Problem mit Image und Graphics AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben