Java - рисовать текст в центре изображения - PullRequest
5 голосов
/ 06 сентября 2011

Мне нужно написать текст в центре изображения.Текст для записи не всегда одинаков.

Код, который я использую, находится здесь:

// 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);

Проблема в том, что текст не в центре изображения,А что я могу сделать?

Мне нужно только нарисовать текст в горизонтальном центре.

Ответы [ 4 ]

7 голосов
/ 06 сентября 2011

Использование JLabel - это меньше работы, но FontMetrics, показанное здесь , позволит вам напрямую управлять геометрией.

5 голосов
/ 07 сентября 2011

Самый простой способ - использовать JLabel с иконкой и текстом.Затем установите горизонтальное / вертикальное положение текста на CENTER, и текст будет нарисован в центре изображения.

Из вашего кода выглядит, как будто вы пытаетесь нарисовать текст в нижней части изображения.В этом случае вы можете использовать JLabel с Icon в качестве контейнера.Затем вы можете установить в макете что-то вроде BoxLayout и добавить еще одну метку с текстом.

Для обоих подходов не требуется настраивать рисование.

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();
            }
        });
    }
}

Я имею в видучтобы написать текст в центре изображения, а затем сохранить изображение

Вы можете использовать Изображение экрана для создания изображения любого компонента.Это предполагает, что вы отображаете изображение и текст в графическом интерфейсе.

Или, если вы говорите о том, что вы просто читаете изображение, добавляете текст в изображение, а затем сохраняете изображение, то вам нужно будет создать BufferedImageи нарисуйте изображение на нем, а затем нарисуйте текст на нем.Вам нужно будет использовать класс FontMetrics, как упомянуто Trashgod.Мое предложение не поможет.

5 голосов
/ 06 сентября 2011

Одно из возможных решений: нарисуйте изображение в JPanel, убедившись, что в качестве размера изображения задайте предпочтительный размер панели, пусть JPanel использует GridBagLayout и поместит текст в JLabel, добавленный в JPanel, безGridBagConstraints.Это один из способов центрировать JLabel в JPanel.

2 голосов
/ 03 октября 2017

Я использовал TextLayout для правильного центрирования текста:

example of generated image

Вот как создать и сохранить изображение в файл:

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));
...