# Dynamische Bilder erzeugen?



## Fats (23. Jan 2007)

Hallo zusammen!

Sagt mal, wie kann ich mit Java dynamische Bilder (Gif, JPG, PNG) erzeugen? Ich gehe mal davon aus, daß Java das kann!  Bei PHP gibt es die gd-lib (ich hoffe, ich hab den Namen jetzt richtig behalten?!) und soetwas muß es doch auch bei Java geben?! Irgendwelche Image-Classes scheint es ja zu geben, aber ich steige noch nicht ganz durch, wofür und ob man was davon gebrauchen kann ...

Ziel ist es auf einer Website Text als Grafik auszugeben. Die Texte sollen in einer bestimmten Font und Farbe dargestellt werden. Ich stell mir das so vor, daß ich ein <img> Tag nehme und dort als src den Namen eines JSPs eintrage und über Parameter ansteuer. In etwa derart:







In der image.jsp werden die Paremeter abgefragt, ein Image erzeugt, Schriftart geladen, Text positioniert, eingefärbt, etc. und das ganze mit "verbogenem" header("Content-type: image/png") zurück gegeben. 

Nett wäre auch, wenn man vorhandene Bilder einladen und ggf. stauchen kann.

Hat da jemand eine Idee, wie das geht?

Vieel Grüße und besten Dank für Hilfe
Fats


----------



## Illuvatar (23. Jan 2007)

Paar Stichwörter:

 - java.awt.image.BufferedImage
 - Image#getGraphics
 - java.awt.Graphics2D
 - javax.imageio.*


----------



## The_S (24. Jan 2007)

Und ein kleiner Sample-Code:


```
BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.red);
g2d.drawString("Hello World", 20, 150);
g2d.dispose();
ImageIO.write(img, "png", "HelloWorld.png");
```


----------



## Fats (25. Jan 2007)

Hey! Vielen Dank! Das sieht doch sehr gut aus! Hab mir Die zugehörigen Klassen mal angesehen und den Code (erstmal theoretisch) nachvollzogen! Hab soweit wohl verstanden, wie es funktioniert. Zwei Fragen hab ich allerdings noch:

a) Die ganzen Formatierung (color, font, etc.) nimmt man ja am Graphics2D Objekt vor. Auf welche Art hängt denn das Objekt noch mit dem eigentlichen Image-Objekt  zusammen? Dieses Image-Objekt wird ja nachher der write-Methode der ImageIO-Klasse übergeben. Irgendwie muß das ja wohl funktionieren ...

b) Wie bekomme ich es hin, daß ich den Header des übergeordneten JSP so verbiegen kann, daß es von aussen wie ein PNG, GIF oder ein JPG aussieht? Ich will in diesem Fall die erstelllte Grafik nicht im Filesystem speichern, sondern direkt an den Server als Image liefern. In PHP gab es dafür damals die header-Funktion. Das wird doch in Java auch klappen, oder  vermutlich wird man dann auch noch den Aufruf der Methode ImageIO.write() etwas modifizieren müssen. Aber wie?

Vielen Dank und beste Grüße
Fats


----------



## Illuvatar (25. Jan 2007)

a) Die Graphics2D, die du von dem Bild kriegst, sind sozusagen das Mittel, um etwas auf das Image zu zeichnen. Wenn du Graphics2D#drawString aufrufst, wird das Image-Objekt intern verändert.

b) Ich hab noch nie was mit JSP gemacht  Aber ich gehe davon aus, dass es irgendeine Funktion gibt, die dem PHP-header() entspricht - dann kannst du ja einfach zuerst diese Funktion aufrufen, und danach das Bild in den Ausgabe-Stream. Das geht so afaik nicht mit der Klasse ImageIO, da brauchst du dann wohl ein javax.imageio.ImageOutputStream.


----------



## EgonOlsen (25. Jan 2007)

write(...) kann auch in einen OutputStream schreiben. Den bekommst du in der jsp-Seite problemlos. Du musst nur aufpassen, dass die Seite selber keine großen Umbrüche oder so enthält (im Code natürlich schon, aber drum herum nicht), weil die bei JSP auch in den Stream gekloppt werden. Ein Servlet zum Erzeugen des Bildes ist eleganter.


----------



## Fats (25. Jan 2007)

EgonOlsen hat gesagt.:
			
		

> write(...) kann auch in einen OutputStream schreiben. Den bekommst du in der jsp-Seite problemlos. Du musst nur aufpassen, dass die Seite selber keine großen Umbrüche oder so enthält (im Code natürlich schon, aber drum herum nicht), weil die bei JSP auch in den Stream gekloppt werden. Ein Servlet zum Erzeugen des Bildes ist eleganter.


Huii .... ich hatte es schon fast geahnt, daß mir jemand ein Servlet  zu schreiben nahelegen würde  Ich hab nur noch nie (bewußt) ein Servlet geschrieben ???:L  Ein Haufen Klassen, die ich in JSPs eingebunden habe, ist kein Problem, aber wie sind die Formalitäten für ein Servlet? OK, die Frage ist hier in der Grafik-Rubrik glaub ich etwas fehl am Platze 
Also Step 1) Servlet beibringen, 2) etwas mit dem OutputStream kuscheln, 3) probieren und 4) ggf. nochmal hier melden   

Bis hierher auf jedenfall schonmal vielen Dank! 
Fats


----------



## Fats (30. Jan 2007)

Nur mal ne Kleinigkeit der Vollständigkeit halber :



			
				Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Und ein kleiner Sample-Code:
> 
> 
> ```
> ...



Die letzte Zeile (6) muß heissen:


```
ImageIO.write(img, "png", new File("HelloWorld.png"));
```

Viele Grüße
Fats


----------

