Sonntag, Juli 5, 2020

Java – Zeichnen von text in der Mitte des Bildes

Muss ich schreiben, text in der Mitte des Bildes. Der text zu schreiben ist nicht immer das gleiche.

Den code, den ich verwende ist der hier:

//Here I first draw the image
g.drawImage(img, 22, 15, 280, 225, null);
//I get the text 
String text = photoText.getText();
//Set the text color to black
g.setColor(Color.black);
//I draw the string 
g.drawString(text, 79.5F, 220.0F);

Das problem ist, dass der text nicht in der Mitte des Bildes, was kann ich tun?

Ich nur ab und zu ziehen Sie den text an der horizontalen Mitte.

InformationsquelleAutor GhzNcl | 2011-09-06

4 Kommentare

  1. 5

    Eine mögliche Lösung: ziehen Sie das Bild in ein JPanel, sicher zu sein, legen Sie die Abdeckung der preferredsize wie die Größe des Bildes, habe die JPanel verwenden Sie ein GridBagLayout, und platzieren Sie den text in einem JLabel Hinzugefügt werden, ist das JPanel, ohne GridBagConstraints. Dies ist ein Weg, um die Mitte der JLabel im JPanel.

    • sehr einfach und richtig +1
    • +1 für die Vermietung der layout-manager die Arbeit machen.
    • Ich werde versuchen, auf diese Weise. Danke.
    • Aber mit dieser Art kann ich nicht das Bild speichern, ich meine, wenn ich das Bild speichern wird der text nicht gespeichert. Ich bin auf der Suche nach einer Möglichkeit zum speichern von text zu. Ich meine ich Schreibe einen text in die Mitte des Bildes und dann speichern Sie das Bild.
  2. 5

    Die einfache Möglichkeit ist die Verwendung eines JLabel mit Icon und Text. Dann legen Sie die horizontale/vertikale position von text zu ZENTRIEREN, und der text ist lackiert in der Mitte des Bildes.

    Aus deinem code sieht es aus wie Sie versuchen zu malen, der text am unteren Rand des Bildes. In diesem Fall können Sie das JLabel mit einem Icon wie ein container. Danach kann man das layout etwas wie ein BoxLayout, und fügen Sie ein weiteres label mit dem text.

    Kein custom-painting ist erforderlich für einen Ansatz.

    import java.awt.*;
    import javax.swing.*;
    
    public class LabelImageText extends JPanel
    {
        public LabelImageText()
        {
            JLabel label1 = new JLabel( new ColorIcon(Color.ORANGE, 100, 100) );
            label1.setText( "Easy Way" );
            label1.setHorizontalTextPosition(JLabel.CENTER);
            label1.setVerticalTextPosition(JLabel.CENTER);
            add( label1 );
    
            JLabel label2 = new JLabel( new ColorIcon(Color.YELLOW, 200, 150) );
            label2.setLayout( new BoxLayout(label2, BoxLayout.Y_AXIS) );
            add( label2 );
    
            JLabel text = new JLabel( "More Control" );
            text.setAlignmentX(JLabel.CENTER_ALIGNMENT);
            label2.add( Box.createVerticalGlue() );
            label2.add( text );
            label2.add( Box.createVerticalStrut(10) );
        }
    
    
        public static class ColorIcon implements Icon
        {
            private Color color;
            private int width;
            private int height;
    
            public ColorIcon(Color color, int width, int height)
            {
                this.color = color;
                this.width = width;
                this.height = height;
            }
    
            public int getIconWidth()
            {
                return width;
            }
    
            public int getIconHeight()
            {
                return height;
            }
    
            public void paintIcon(Component c, Graphics g, int x, int y)
            {
                g.setColor(color);
                g.fillRect(x, y, width, height);
            }
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("LabelImageText");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new LabelImageText() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }

    Ich meine ich Schreibe einen text in die Mitte des Bildes und dann speichern Sie das Bild

    Können Sie Bild erstellen Sie ein abbild einer Komponente. Dies setzt Voraus, Sie zeigt Ihr das Bild und den text auf eine GUI.

    Oder, wenn man nur das Lesen in ein Bild hinzufügen von text zu dem Bild und dann das Bild speichern, dann müssen Sie erstellen Sie ein BufferedImage und zeichne das Bild an und ziehen Sie dann den text auf. Sie müssen die FontMetrics-Klasse wie bereits erwähnt durch Trashgod. Mein Vorschlag nicht helfen.

    • Ich werde die FontMetrics-Klasse, weil ich brauche, um das Bild zu speichern, aber ich bin auch mit einer GUI, Kann ich Ihren Vorschlag so?
    • +1 für ScreenImage; siehe auch dies ImageIO example..
    • Ich verstehe nicht, Ihre Frage. Ich gab Sie funktionierenden code. Nur du kannst entscheiden, ob es das macht, was Sie wollen. Ich gab auch einen link zu ScreenImage, die zeigt, wie es zu benutzen auf sichtbare oder nicht-sichtbare Komponenten.
  3. 3

    Ich verwendet TextLayout, um den text richtig zentriert:

    Java - Zeichnen von text in der Mitte des Bildes

    Hier ist, wie zu erstellen und speichern Sie die Bild-Datei:

    int imgWidth = 250;
    int imgHeight = 250;
    BufferedImage img = new BufferedImage(imgWidth, imgHeight,
            BufferedImage.TYPE_INT_RGB);
    
    Graphics2D g = img.createGraphics();
    
    Color backgroundColor = new Color(0, 150, 100);
    g.setPaint(backgroundColor);
    g.fillRect(0, 0, imgWidth, imgHeight);
    
    Font font = new Font("Arial", Font.PLAIN, 80);
    g.setFont(font);
    g.setPaint(Color.WHITE);
    
    String text = "0";
    
    TextLayout textLayout = new TextLayout(text, g.getFont(),
            g.getFontRenderContext());
    double textHeight = textLayout.getBounds().getHeight();
    double textWidth = textLayout.getBounds().getWidth();
    
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    
    //Draw the text in the center of the image
    g.drawString(text, imgWidth / 2 - (int) textWidth / 2,
                       imgHeight / 2 + (int) textHeight / 2);
    
    String imgFormat = "png";
    ImageIO.write(img, imgFormat, new File("/home/me/new_image." + imgFormat));

Kostenlose Online-Tests