Создание размера изображения из строки в Java - PullRequest
0 голосов
/ 03 февраля 2012

Я делаю 2D движок, использующий Java на основе сущностей.Физика и спрайты сделаны, но мне все еще нужно уметь рисовать текст с классом BaseText.Для экспериментальных целей я использую следующий код в классе Renderer (который обрабатывает отрисовку всех спрайтов и т. Д.):

BufferGraphics.drawString(((BaseText) Entity).getText(), (int) -(Origin.getX() * PositionTransform), (int) -Origin.getY());

Однако я хотел бы переместить этот код вsetText(final String Text) метод сущности BaseText, т. е. когда она вызывается, создается новое изображение, содержащее указанный текст (возможно, с разными шрифтами и размерами и тому подобное, я еще не решил).

MyПроблема заключается в следующем: я хотел бы иметь возможность изменить размер (масштабировать) текст по своему вкусу.Было бы также неплохо преобразовать текст в изображение, так как я могу получить его размеры и установить размер самого текстового объекта.

В основном, то, что мне нужно, следует следующим образом:

  1. Возьмите нужную строку и введите ее в метод setText.
  2. Возьмите строку и нарисуйте ее на изображении, размер которого соответствует размеру текста.
  3. Установите это новое изображение в поле Image в сущности, чтобы двигатель мог его нарисовать.

Возможно ли это?Может быть способ сделать это с помощью класса FontMetrics или как там его можно назвать, но я не настолько уверен, потому что я не использовал его раньше.

Редактировать: Позвольте мне уточнить: я хочу создать изображение BufferedImage, основанное на размере некоторого текста, заданного для определенного шрифта и размера, а не на размере текста, чтобы соответствовать изображению.так любезно предоставленный код, я смог добавить некоторый код в движок, который, во что бы то ни стало, просто должен работать.Однако, опять же, даже с этим drawRect, изображение либо остается прозрачным, либо как-то не рисуется.Позвольте мне предоставить несколько панировочных сухарей: -snip-

Глупо то, что все остальные спрайты, изображения и тому подобное хорошо рисуются, так что я не уверен, как это может быть в Renderer.Кстати, это был метод paint ().

Edit 3:
...
Э-э ...
...
О, боже.
Iя ...
...
Текст не может объяснить, как сильно я подпирал себе левую ладонь в лицо.

BaseText.java

@Override
public BufferedImage getImage() {return null;}

Renderer.java

BufferedImage Image = Entity.getImage();

Я
огромный идиот.
Спасибо, Эндрю, за этот код.Он работал нормально.

Редактировать 4: Кстати, вот последний код, который я использовал:

public void setText(final String Text)
{
    Graphics2D Draw = (Graphics2D) Game.View.getBuffer().getDrawGraphics();
    FontMetrics Metrics = Draw.getFontMetrics();
    Rectangle2D Bounds = Metrics.getStringBounds(Text, Draw);
    BufferedImage NewImage = new BufferedImage((int) Bounds.getWidth(), (int) (Bounds.getHeight() + Metrics.getDescent()), BufferedImage.TYPE_INT_RGB);
    Draw = (Graphics2D) NewImage.getGraphics();
    Draw.setColor(new Color(0xAAFF0000));
    Draw.drawRect(0, 0, NewImage.getWidth(), NewImage.getHeight());
    Draw.drawString(Text, 0, (int) Bounds.getHeight());
    this.Image = NewImage;
    this.Text = Text;
    this.setSize(new Vector(NewImage.getWidth(), NewImage.getHeight()));
}

1 Ответ

2 голосов
/ 03 февраля 2012
  1. Используйте FontMetrics, GlyphView или предпочтительный размер JLabel (удобно для получения размера, необходимого для отображения форматированного текста.
  2. Отрегулируйте размеры шрифта на шаге 1, пока он не подойдет. Вызовите BufferedImage.createGraphics(), чтобы получить Graphics2D объект. Нарисуйте String к этому.
  3. Я не понимаю пункт 3, поэтому не буду комментировать.

Вот как это будет работать с FontMetrics или JLabel.

import java.awt.*;
import java.awt.image.*;
import java.awt.geom.Rectangle2D;
import javax.swing.*;

class TextSize {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // Technique 1 - FontMetrics
                String s = "The quick brown fox jumps over the lazy dog!";
                BufferedImage bi = new BufferedImage(
                    1,
                    1,
                    BufferedImage.TYPE_INT_RGB);
                Graphics g = bi.getGraphics();
                FontMetrics fm = g.getFontMetrics();
                Rectangle2D b = fm.getStringBounds(s,g);
                System.out.println(b);
                bi = new BufferedImage(
                    (int)b.getWidth(),
                    (int)(b.getHeight() + fm.getDescent()),
                    BufferedImage.TYPE_INT_RGB);
                g = bi.getGraphics();
                g.drawString(s,0,(int)b.getHeight());

                JOptionPane.showMessageDialog(
                    null,
                    new JLabel(new ImageIcon(bi)));

                // Technique 3 - JLabel
                JLabel l = new JLabel(s);
                l.setSize(l.getPreferredSize());
                bi = new BufferedImage(
                    l.getWidth(),
                    l.getHeight(),
                    BufferedImage.TYPE_INT_RGB);
                g = bi.getGraphics();
                g.setColor(Color.WHITE);
                g.fillRect(0,0,400,100);
                l.paint(g);

                JOptionPane.showMessageDialog(
                    null,
                    new JLabel(new ImageIcon(bi)));
            }
        });
    }
}
...