[Java] Bilder mit Text beschreiben

krizzelfix

Commander
Registriert
Sep. 2005
Beiträge
2.626
Hallo Ihr,

ich bin grad dabei ein Programm zu schreiben, mit dem ich Text auf Bilder schreibe.
Nur wie kann ich einstellen welche Schriftfarbe, Art Größe etc. verwendet werden soll?

Grüße

tewes

//edit: Keiner eine Idee
 
Zuletzt bearbeitet:
Was du machen kannst ist ein JPanel ableiten und in der abgelittenen Klasse die paint-Methode überschreiben. du kannst dir damit also ein JPanel mit Hintergrundbild malen.

In dieser Klasse verwendest du dann die Klasse Font, um die Schrift hinzumalen.
 
Zuletzt bearbeitet:
Vielen Dank Cobinja,

werde es mal so probieren.

Grüße

tewes

//Edit: Wie kann ich den dem Panel ein Text zuweisen?
 
Zuletzt bearbeitet:
Vergiss mal bitte den zweiten Teil von meinem Vorschlag.

Du kannst in JLabels den Font setzen, die methode heißt JLabel.setFont(Font).
 
Habe jetzt ein JLabel geerbt und die Paint-Methode überschrieben:
Code:
public class JPaintText extends JLabel  {
    
    /** Creates a new instance of JPaintText */
    private static int left  = 0;
    private static int right = 0;
    private static String Text =  "";
    public JPaintText(String Text, int left, int right) {
        this.Text = Text;
        this.left = left;
        this.right = right;
    }
    @Override
    public void paint( Graphics g ) {
        this.setFont(new java.awt.Font("Arial", 0, 18));
        this.setForeground(new java.awt.Color(0, 0, 204));
        this.setBackground(new java.awt.Color(0,0,0));
        g.drawString(this.Text, this.left, this.right);
    }
}
Nur wie kann ich das jetzt auf das Bild bekommen?

Grüße

tewes
 
Das JLabel brauchst du nicht ableiten. Du kannst es, so wie es ist, aufs Panel legen und dann mit jLabel.setFont() den Font setzen
Code:
JLabel jLabel = new JLabel();
jLabel.setText("JLabel");
jLabel.setFont(new Font("Garamond", Font.PLAIN, 24));
jContentPane = new JPanel();
jContentPane.setLayout(new FlowLayout());
jContentPane.add(jLabel);
 
Sry habe noch nicht so viel Ahnung von Java.
Mir stellt nich nämlich immer noch die Frage wie ich das Panel auf das Bild bekommen soll.
 
Naja, du kannst eigentlich nicht das Panel auf das Bild bekommen, sondern das Bild als Hintergrund aufs Panel, das du, wie oben beschrieben, ableitest.

Der paint()-methode wird ein Graphics-Objekt übergeben. Dieses stellt mehrere Methoden mit dem Namen drawImage() bereit, jeweils mit verschiedenen Parametern.

Als letzten Parameter erwarten die Methoden alle ein Objekt vom Typ ImageObserver. dies interface ist vom JPanel selbst implementiert, du kannst also "this" übergeben. Die anderen Parameternamen sollten für sich selbst sprechen.

Hier noch ein Link zu Grafiken in Java:
http://www.galileocomputing.de/openbook/javainsel6/javainsel_15_006.htm#Xxx1000222
 
Zuletzt bearbeitet:
So habe noch etwas rumprogrammiert, nur ich bekomme es nicht hin ein Graphics in ein (Buffered)Image zu konvertieren.
Code:
public class JPaintText extends JPanel  {
    /** Creates a new instance of JPaintText */
    private static int left  = 0;
    private static int top = 0;
    private static String Text =  "";
    private static Image backgroundimage;
    private static Graphics DrawedImage;
    public JPaintText(Image img, String Text, int left, int top) {
        this.Text = Text;
        this.left = left;
        this.top = top;
        this.backgroundimage = img;
    }
    @Override
    public void paint(Graphics g) {
        JLabel jLabel = new JLabel();
        jLabel.setText(this.Text);
        jLabel.setFont(new Font("Arial", Font.PLAIN, 24));
        JPanel jContentPane = new JPanel();
        jContentPane.setLayout(new FlowLayout());
        jContentPane.add(jLabel);
        g.drawImage(this.backgroundimage, this.left, this.top, this);
        this.DrawedImage = jContentPane.getGraphics();
    }
    public Graphics getdrawedImage(){
        if(this.DrawedImage != null){
            return this.DrawedImage;
        }
        return null;
    }
}
Grüße

tewes
 
Das Graphics-Objekt ist nicht das Bild, sondern eine Art Helferlein, um etwas zu zeichnen oder ein importiertes Bild darzustellen. sieh es als Leinwand an, auf der du das Bild unterbringen kannst.

Ich hab mal auf die schnelle eine Klasse geschrieben:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class JImagePanel extends JPanel  {
  
  private String imageFileName = null;
  private boolean isNewImage = true; // wird gesetzt, um anzuzeigen, daß der Dateiname geändert ist
  private Image image = null;
  
  @Override
  public void paint(Graphics g) {
    super.paint(g);
    if (isNewImage && imageFileName != null && imageFileName.length() > 0) {
      Image oldImage = image;
      try {
        // iamge laden
        image = ImageIO.read(new File(imageFileName));
        isNewImage = false;
      }
      catch (IOException e) {
        e.printStackTrace();
        image = oldImage;
      }
    }
    // wenn das Image erfolgreich geladen wurde, dann wird es gemalt
    if (image != null)
      g.drawImage(image, 0, 0, this); // dieser Aufruf bringt das Bild auf die Leinwand
  }
  
  public String getImageFileName() {
    return imageFileName;
  }
  
// Mit dieser methode gibst du den dateinamen eines Bildes an
  public void setImageFileName(String imageFileName) {
    this.imageFileName = imageFileName;
    this.repaint();
  }
    
}
Ein Objekt dieser Klasse einfach statt eines JPanel auf den Frame packen und ansonsten behandeln, als wär's ein ganz normales JPanel
 
Zuletzt bearbeitet:
Vielen Dank Cobinja, werde es mir in den nächsten Tagen, wenn ich Zeit habe, angucken.

Grüße

tewes

//habe jetzt mal di Klasse eingebaut, bin aber kein Stück weiter-.-

Wo muss ich den Text übergeben, der auf das Bild geschrieben wird?
Und wie kann ich das Bild speicher?

Grüße

tewes
 
Zuletzt bearbeitet:
Ich glaub ich kapier jetzt erst, was du überhaupt machen willst. Du willst ein Bild bearbeiten, nicht einfach nur darstellen.

In der Klasse Graphics gibt es die Mehtoden setFont() und drawString(). Und das Image hat eine Methode namens getGraphics(). Fällt der Groschen?

Du kannst also das Graphics-Objekt vom Image benutzen, um das Image zu bearbeiten und das Graphics-Objekt vom Panel, um das Bild darzustellen.

BTW, falls du's noch nicht kennst:
http://java.sun.com/javase/6/docs/api/
Ist einfach praktisch, wenn man wissen will, was für Methoden eine Klasse oder ein Interface bereitstellt.
 
Zuletzt bearbeitet:
Oke mache das jetzt so:
Code:
                BufferedImage pic = ImageIO.read(file);
                String dest = Zielpfad + "/" + file.getName().toString();
                Graphics g = pic.getGraphics();
                g.setFont(new java.awt.Font("Arial", 0, 18));
                g.drawString(Text, pic.getWidth()-15, 15);
                ImageIO.write(,"jpeg", dest);//Konvertierung fehlt
Nur ich komme immernoch nicht drauf wie ich die bemalte Leinwand an die Wand bekomme ;).

Und die Doku kenn ich schon, aber ich finde die Absolut unübersichtlich. Da ist Microsoft das SDK zu C# wesentlich besser gelungen.
 
Zum Schreiben mit ImageIO nimmst du einfach
Code:
ImageIO.write(pic, "jpeg", dest);
Um das Bild im Fenster anzuzeigen nimmst du meine obige Klasse und gibst ihr noch die beiden Methoden getImage() und setImage(Image image):
Code:
public Image getImage {
  return image;
}

public void setImage(Image image) {
  this.image = image;
  this.repaint();
}
 
Oke vielen dank.
Nur aus irgendeinem Grund zeigt der mir ein Syntax-Fehler bei ImageIO.write();.
Hab noch etwas in einem anderen Forum gefunden, nur meins Akzeptiert der nicht, obwohl es vom Prinzip das gleiche ist.
Mein Programm-Quelltext:
Code:
            try{
                BufferedImage pic = ImageIO.read(file);
                String dest = Zielpfad + "/" + file.getName().toString();
                Graphics g = pic.createGraphics();
                g.setFont(new java.awt.Font("Arial", 0, 18));
                g.drawString(Text, pic.getWidth()-15, 15);
                g.dispose();
                ImageIO.write(pic, "jpeg", dest);//Hier wird der Fehler angezeigt: "cannot find symbol"
            }
            catch(IOException e){
                errors.add(e.getMessage());
            }
Das aus dem anderen Forum:
Code:
     Graphics g = pic.createGraphics();
       g.drawImage(mark, 0,0,mark.getWidth(), mark.getHeight(), null);
       g.dispose();
       try {
         ImageIO.write(pic, "jpeg", dest);
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
Habe auch schon die Imports Kopiert, nur es kommt immer noch der gleiche Fehler.

Hoffe du findest den Fehler, bin schon fast am verzweifeln.

Grüße

tewes
 
Hab jetzt grade kein Java zur Hand, kann also nichts ausprobieren. Es könnte zwei Ursachen haben:

1. ImageIO.write() erwartet als dritten Parameter ein File, ImageOutputstream oder einen OutputStream, aber keinen String

2. Wenn du g.dispose() aufrufst, bevor du das Image gespeichert hast, könnte das Bild einfach futsch sein.
Javadoc schrieb:
A Graphics object cannot be used after dispose has been called.
 
Vielen Dank. Ich vermute es liegt an dem ersten Fehler.

Werde es nachher zu hause probieren.

Grüße

tewes
 
Zurück
Oben