Java - запись текста на изображение, затем запись в выходной файл - PullRequest
5 голосов
/ 12 октября 2011

У меня есть изображение, поверх которого я хотел бы написать текст, состоящий из нескольких строк, выровненный по центру и динамический (с переменной шириной).Я пытался использовать метод drawString из Graphics, но не смог заставить работать центрирование и динамическое позиционирование.В настоящее время я копаюсь в библиотеке swing с JLabels и тому подобным, но мне трудно найти относительно простой подход к этому.Я также хотел бы, чтобы окончательное изображение было записано в файл, но кажется, что смешивание ImageIO с JPanel s не очень хорошо работает ... У меня сейчас просто черный ящик ... Если кто-то можетпредоставьте даже простую схему того, как к этому подойти, я был бы очень признателен.

Спасибо!


Извините, мне следовало быть более конкретным ... Мне бы хотелось, чтобы текстсама должна быть выровнена по центру (как в середине каждой строки должны быть выровнены), вместо того, чтобы текст располагался в центре изображения.Текст будет размещен в другом месте на изображении, а не в середине.Еще раз прошу прощения за неясные описания.Спасибо!

Ответы [ 3 ]

8 голосов
/ 12 октября 2011

Вам совсем не нужно качать, если вы просто хотите сгенерировать файлы изображений.

Вы можете сделать что-то вроде этого:

import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

BufferedImage img = ImageIO.read(new File("dog.jpg")); // try/catch IOException
int width = img.getWidth();
int height = img.getHeight();

BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bufferedImage.createGraphics();

// draw graphics
g2d.drawImage(img, 0, 0, null);
g2d.drawString(text, x, y);

g2d.dispose();

try {

// Save as PNG
File file = new File("newimage.png");
ImageIO.write(bufferedImage, "png", file);

// Save as JPEG
file = new File("newimage.jpg");
ImageIO.write(bufferedImage, "jpg", file);

} catch (IOException e) { }

Для получения дополнительной информации см .:

http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html

Выравнивание и центрирование текста можно выполнить с помощью класса FontMetrics.

2 голосов
/ 13 октября 2011

Используйте JLabel для отображения изображения и текста:

JLabel picture = new JLabel( new ImageIcon(...) );
picture.setText("<html><center>Text<br>over<br>Image<center></html>");
picture.setHorizontalTextPosition(JLabel.CENTER);
picture.setVerticalTextPosition(JLabel.CENTER);

Затем вы можете использовать класс Screen Image для создания изображения любого компонента.

Изменить:

Пропустили ваше обновление, что вы не хотите, чтобы текст по центру изображения.Для вашего нового требования вы можете добавить другие компоненты на этикетку, чтобы сделать форматирование для вас.Приведенный ниже код показывает исходное предложение, как и некоторые примеры использования компонентов:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

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

        //

        JLabel label3 = new JLabel( new ColorIcon(Color.GREEN, 200, 150) );
        add( label3 );

        JLabel text3 = new JLabel();
        text3.setText("<html><center>Text<br>over<br>Image<center></html>");
        text3.setLocation(20, 20);
        text3.setSize(text3.getPreferredSize());
        label3.add( text3 );

        //

        JLabel label4 = new JLabel( new ColorIcon(Color.CYAN, 200, 150) );
        add( label4 );

        JTextPane textPane = new JTextPane();
        textPane.setText("Add some text that will wrap at your preferred width");
        textPane.setEditable( false );
        textPane.setOpaque(false);
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        StyledDocument doc = textPane.getStyledDocument();
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
        textPane.setBounds(20, 20, 75, 100);
        label4.add( textPane );
    }

    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();
            }
        });
    }
}
2 голосов
/ 12 октября 2011

Вы должны использовать drawString().

Чтобы правильно отцентрировать текст, вам нужно рассчитать ширину для данного шрифта:

Font font = getFont();
FontMetrics metrics = getFontMetrics( font );
int width = metrics.stringWidth( theString );

И не забудьте добавить -Djava.awt.headless=true, если вы хотите позвонить на сервер (без графического интерфейса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...