BufferedImage mit html interpretierten String beschriften

Status
Nicht offen für weitere Antworten.

Milbo

Mitglied
Hallo hilfereiches Forum,
wir haben hier schon oft gelesen und gute Hilfe gefunden. Danke erstmal dafür.

Mein Kumpel und ich versuchen momentan folgendes Problem zu lösen.

Ich habe eine SwingGUI geschrieben. Die Eingabedaten werden als technische Zeichnung interpretiert. Dabei wird ein Graphics2D benutzt. Darüber wird ein Bild gezeichnet mit BufferedImage. Dann wird das ganze mit drawString beschrifted. In der gesamten restlichen Swingoberfläche werden die Variablen wie alpha, delta tiefer oder höher gestellten Indices einfach über die Documentart als html geparst und dadurch dargestellt.

Nun suchen wir nach einem Weg, das was in einem jEditorPane bzw mit dem HtmlEditorKit dargestellt wird irgendwie auf die Graphik zu übertragen.

Die allgemeine Frage ist, wie wir einen formatierten Text z.B. ein α<sub>A</sub> auf ein Bild bekommen. Das ganze am besten in html.

Hier mal ein Testprogramm, welches das Problem hoffentlich verdeutlicht.

Mit herzlichen Grüßen
Milbo

Code:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.StringReader;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLEditorKit;

public class HtmlaufBild {

	JFrame frame;
	Graphics2D g2;
	BufferedImage buff;
	int width = 400;
	int height = 200;
	Color fg = Color.black; // vordergrund
	Color bg = Color.white;
	
	public static void main(String[] args) {
		HtmlaufBild main = new HtmlaufBild();
	}
	
	private HtmlaufBild(){
		frame = new JFrame();
		frame.setSize(400, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocation(100, 100);
		frame.setVisible(true);
	
		initGraphics();
		JLabel neuezeichnung = new JLabel(draw());
		frame.add(neuezeichnung);
	}
	
	private ImageIcon draw(){        
		g2.setPaint(fg);
		g2.fill( new Rectangle2D.Double(25, 25, width-50, height-50));
		
		g2.setPaint(Color.red);	
		String zuParsenderString = "A<sub>K</sub>";
		String geparsterString = htmlParsen(zuParsenderString);
		
		//Wird drawString die geparsten Zeichen interpretieren?
		g2.drawString(geparsterString,50, 50);	   
		return new ImageIcon(buff);
	}
	
	private void initGraphics(){
		buff = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
		g2 = buff.createGraphics();
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setFont(new Font("Arial", Font.PLAIN, 10));
		g2.setBackground(bg);
		g2.clearRect(0, 0, width, height);
	}

	public String htmlParsen(String zuParsenderText){
		StringReader r = new StringReader(zuParsenderText);
		HTMLEditorKit.Parser parse = new HTMLParse().getParser();
		HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback();

		try {
			parse.parse(r,callback,true);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Wo landet das geflushte
		try {
			callback.flush();
		} catch (BadLocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//Hmm und wie kommen wir jetzt an das geparste im Callback ran?
		String geparsterText = callback.toString();
		return geparsterText;
	}
	
  /**
   * Call to obtain a HTMLEditorKit.Parser object.
   * Von Seite [url]http://www.samspublishing.com/articles/article.asp?p=31059&rl=1[/url]
   * @return A new HTMLEditorKit.Parser object.
   */
	public class HTMLParse extends HTMLEditorKit{
		public HTMLEditorKit.Parser getParser(){
			return super.getParser();
		}
	}
}
 

Marco13

Top Contributor
Interessante Frage. Eigentlich hätte ich erwartet, dass das irgendwie "einfach" geht, aber wenn man sich dann erstmal eine Weile durch BasicLabelUI, BasicHTML, StyledDocument und View gehangelt hat, merkt man: Sooo einfach ist es scheinbar doch nicht.

Zumindest ist die einzige einfache Lösung, die ich gefunden habe, SO einfach, dass sie vermutlich als "Hack" zu bezeichnen wäre.

BTW: Was das mit dem HTMLEditorKit sollte, hab ich irgendwie nicht gerafft... Man kann doch das HTML (zumindest wenn man es so macht, wie ich es gemach habe :wink: ) direkt verwenden!?

Die "interessante" Methode ist "paintHTML"....

Code:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.StringReader;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.text.*;
import javax.swing.plaf.basic.*;
import javax.swing.text.html.HTMLEditorKit;

public class HtmlaufBild {

   JFrame frame;
   Graphics2D g2;
   BufferedImage buff;
   int width = 400;
   int height = 200;
   Color fg = Color.black; // vordergrund
   Color bg = Color.white;

   public static void main(String[] args) {
      HtmlaufBild main = new HtmlaufBild();
   }

   private HtmlaufBild(){
      frame = new JFrame();
      frame.setSize(500, 400);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setLocation(100, 100);
      frame.setVisible(true);

      initGraphics();
      JLabel neuezeichnung = new JLabel(draw());
      frame.add(neuezeichnung);
   }

   private ImageIcon draw(){
      g2.setPaint(fg);
      g2.fill( new Rectangle2D.Double(25, 25, width-50, height-50));

      g2.setPaint(Color.red);
      String zuParsenderString = "A<sub>K</sub><font color=#00FF00 size=13>big</font>";

      //Wird drawString die geparsten Zeichen interpretieren?
      //g2.drawString(geparsterString,50, 50);
      paintHTML(g2, 50, 50, zuParsenderString);

      return new ImageIcon(buff);
   }

   private void paintHTML(Graphics2D g, int x, int y, String htmlString)
   {
      JLabel test = new JLabel("<html>"+htmlString+"</html>");
      test.setForeground(Color.red);
      test.setBounds(0,0, test.getPreferredSize().width, test.getPreferredSize().height);
      g2.translate(x,y);
      test.paint(g2);
      g2.translate(-x,-y);
   }


   private void initGraphics(){
      buff = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
      g2 = buff.createGraphics();
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setFont(new Font("Arial", Font.PLAIN, 10));
      g2.setBackground(bg);
      g2.clearRect(0, 0, width, height);
   }

}


Vielleicht findet ja noch jemand eine (genauso einfache aber) "sauberere" Lösung.
 

The_S

Top Contributor
Üblicherweiße zeichnet man (imho) eine nicht dargestelle Komponente über SwingUtilities#paintComponent. Aber ansonsten fällt mir auch keine bessere Lösung ein.
 
G

Guest

Gast
Marco13 hat gesagt.:
Interessante Frage. Eigentlich hätte ich erwartet, dass das irgendwie "einfach" geht, aber wenn man sich dann erstmal eine Weile durch BasicLabelUI, BasicHTML, StyledDocument und View gehangelt hat, merkt man: Sooo einfach ist es scheinbar doch nicht.
Vielen Dank erstmal dafür, ... tscha genauso hatte zuvor Ich und mein Kumpel gedacht.

Marco13 hat gesagt.:
BTW: Was das mit dem HTMLEditorKit sollte, hab ich irgendwie nicht gerafft... Man kann doch das HTML (zumindest wenn man es so macht, wie ich es gemach habe :wink: ) direkt verwenden!?
Nun, JLabel bzw die jEditorPane benutzt laut API intern das HTMLEditorKit. Ursprünglich machte ich mir keine Sorgen, weil sich das Problem so einfach anhört und eigentlich javaintern bereits gelöst ist. Aber dann wurde es aufeinmal richtig nervig. Wir hatten auch den Lösungsansatz JLabels zu machen und daraus dann Bilder gewinnen und auf das Hauptbild pappen. Genau diesen Lösungsansatz hast du benutzt, uns erschien es als zu krasser Hack und dachten uns,.. das muss doch einfacher gehn lool. Was uns allerdings verblüfft hat, wie du es geschafft hast, dass das JLabel transparent ist. Nun ich baue jetzt die Methode ein, mal sehen wie es sich verhält.

Vielen Dank
Milbo
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
D BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
2 Memory Leak mit BufferedImage !! AWT, Swing, JavaFX & SWT 15
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
C Rotate BufferedImage --> Bild unvollständig AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
J Image to BufferedImage AWT, Swing, JavaFX & SWT 5
T BufferedImage kopieren AWT, Swing, JavaFX & SWT 3
T BufferedImage Farbe "Transparent" AWT, Swing, JavaFX & SWT 21
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
M BufferedImage Größe? AWT, Swing, JavaFX & SWT 10
U Löschen eines BufferedImage AWT, Swing, JavaFX & SWT 7
J Image aus BufferedImage ohne AWT AWT, Swing, JavaFX & SWT 5
V Image in BufferedImage AWT, Swing, JavaFX & SWT 3
J BufferedImage aus byte-Array erstellen AWT, Swing, JavaFX & SWT 3
izoards HTML Editor AWT, Swing, JavaFX & SWT 3
H setToolTipText ignoriert HTML-Formatierung des anzuzeigenden Strings AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben