Warum wird dieses Rechteck nicht korrekt gemalt?

sirbender

Top Contributor
Hallo,

ich will ein Rechteck zeichnen. Ich speichere es in einem Bild ab. Leider wird die rechte und untere Seite wird nicht gezeichnet.

Das Problem ist leicht zu loesen, indem man g2.drawRect(0,0,w-1,h-1) aufruft. Aber warum muss ich w und h um -1 verkleinern? Das Bild hat die Dimensionen w x h und das Rechteck, dass ich zeichnen will hat die Dimensionen w x h. Warum also wird es erst richtig gezeichnet wenn ich w und h um 1 verkleinere?

Hier der Code der nicht richtig funktioniert:

Code:
	public static void main(String[] args) throws IOException {
		int w = 800;
		int h = 1000;
		
		BufferedImage bitmap = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = bitmap.createGraphics();
		g2.setColor(Color.CYAN);
		g2.drawRect(0, 0, w, h);
		
		ImageIO.write(bitmap, "png", new File("test.png"));
	}
 
Das Bild hat die Dimensionen w x h und das Rechteck, dass ich zeichnen will hat die Dimensionen w x h. Warum also wird es erst richtig gezeichnet wenn ich w und h um 1 verkleinere?
Weil das Rechteck das du zeichnest eine Größe von w+ und h+1 hat. Stell dir das ganze als Schachbrett vor. Es hat 8x8 Felder, also kannst du von Feld 0 bis 7 einen Linie zeichnen, ohne das Brett zu verlassen.
 
Hmmm... könnte es mir nur so erklären, dass das Rec ja im Image malt und daher nicht die komplette größe nutzt. Eigentlich auch logisch, da ja das Image die Größe 800*1000 hat.
Dann zeichnest du das Rect in diesem Image und fängst oben links an zu zeichen. Aber da sind nach rechts und unten halt nur noch 999, bzw. 799 platz. Alles darüber zeichnet über den Horizont des Images. ^^

Leicht zu veranschaulichen, wenn du das Image einfach mal jeweils um den Wert 1 erhöhst.
 
Also das Bild hat 800 Pixel in der Breite. Wenn ich da ein Rechteck draufzeichne mit einer Breite von 800 (pixeln), dann sollte das auch passen. Im JavaDoc von drawRect steht, dass width die Breite des gezeichneten Rechtecks angibt.
 
richtig. Wenn du z.B. auf eine canvas mit einer Breite von beispielsweise 1024 zeichnen würdest.
Stell dir das Image als Schachtel vor, dessen Außenmaße von deinen entsprechen. Bedenkt man den Schachtelrand, passt dort keine Fläche mit den gleichen Außenmaßen hinein. 🙂
 
Im javadoc von Java7 steht:
Draws the outline of the specified rectangle. The left and right edges of the rectangle are at x and x + width. The top and bottom edges are at y and y + height. The rectangle is drawn using the graphics context's current color.
Das steht nirgendwo explizit, daß width die Breite des Rechtecks angibt.
Wenn du also ein Rechteck von 0,0 nach 2, 2, zeichnest, liegen die Eckpunkte bei 0, 0 und 2, 2. Und das resultierenden Rechteck hat dan numal 3x3 Pixel. Und wenn du das versucht, auf ein Bild mit 2x2 Pixeln zu zeichnen, wird was abgeschnitten.
Wenn du eine Array der Länge 3 deklarierst, gibt es ja auch nur Elemente bei 0, 1 und 2, und nicht 3.
Sorry, nimm es einfach zur Kenntnis, daß es so ist, wie es ist, oder beschwere dich bei oracle über die irreführende API Dokumentation.
 

Zurück
Oben