Graphics2D und BufferedImage

Folgende Methode habe ich – mal wieder –einem Buch entnommen:

public static BufferedImage makeMessageImage(String message,
String fontName,
int fontSize)
{
Font font = new Font(fontName, Font.PLAIN, fontSize);
FontMetrics metrics = getFontMetrics(font);
int messageWidth = metrics.stringWidth(message);
int baselineX = messageWidth/10;
int width = messageWidth + 2*(baselineX + fontSize);
int heigth = fontSize*7/2;
int baselineY = heigth*8/10;
BufferedImage messageImage =
new BufferedImage(width, heigth,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)messageImage.getGraphics();
g2d.setBackground(Color.white);
g2d.clearRect(0, 0, width, heigth);
g2d.setFont(font);
g2d.translate(baselineX, baselineY);
g2d.setPaint(Color.lightGray);
AffineTransform origTransform = g2d.getTransform();
g2d.shear(-0.95, 0);
g2d.scale(1, 3);
g2d.drawString(message, 0, 0);
g2d.setTransform(origTransform);
g2d.setPaint(Color.black);
g2d.drawString(message, 0, 0);
return messageImage;
}

Was ich mich nun Frage ist, wieso eigentlich das BufferedImage-Objekt zurückgegeben werden kann, obwohl es doch eigentlich nur kreiert wird, um ein Graphics2D-Objekt zu liefern. Müsste nicht im Prinzip das Graphics2D-Obejtk zurückgegeben werden? Oder wo bleibt dies ab?

Moien

pre-Tag sind was wunderbares…

Ich übersetz das mal auf Deutsch:

BufferedImage messageImage = new BufferedImage(width, heigth,BufferedImage.TYPE_INT_RGB);

erzeuge ein farbiges Bild der Grösse width x heigth.

Graphics2D g2d = (Graphics2D)messageImage.getGraphics();

Besorg dir einen Stift um in das Bild rein zu malen.

g2d.setBackgrou…

Male in dem Bild rum.

return messageImage;

und gibt das fertige Bild zurück.

cu

Was ich mich nun Frage ist, wieso eigentlich das
BufferedImage-Objekt zurückgegeben werden kann, obwohl es doch
eigentlich nur kreiert wird, um ein Graphics2D-Objekt zu
liefern. Müsste nicht im Prinzip das Graphics2D-Obejtk
zurückgegeben werden? Oder wo bleibt dies ab?

Ich verstehe das so:

  • jemand ruft die Methode auf
  • Image wird erzeugt
  • Device Context vom Image wird geholt (getGraphics())
  • da wird dann „reingezeichnet“
  • schliesslich wird das Image zurueckgegeben
  • jemand zeigt das Image an oder macht sonstwas damit

Das Image wird also nicht erzeugt, um ein Graphics2D-Objekt zu
liefern, sondern das Graphics2D-Objekt ist Teil des Images, in dem
du deine auf das Image bezogene Zeichenoperationen ausfuehren
kannst.

Gruss
Patrick

Hey Patrick und Pumpkin, DANKE für Eure Antworten!
Hier sind die Antworten doch brauchbarer als in so manchem ‚offiziellen‘ Java-Forum!
Gruß, Lars