在Java中用字符串创建大小合适的图像

在Java中用字符串创建大小合适的图像,java,string,entity,image-manipulation,drawable,Java,String,Entity,Image Manipulation,Drawable,我正在使用基于实体的Java制作一个2d引擎。物理和精灵已经完成,但我仍然需要能够使用BaseText类绘制文本。出于实验目的,我在渲染器类中使用了以下代码(用于绘制所有精灵等): 但是,我希望能够将此代码移动到BaseText实体的setText(最终字符串文本)方法中,即,当它被调用时,将创建一个包含指定文本的新图像(可能使用不同的字体和大小等,我尚未决定) 我的问题是:我希望能够根据自己的喜好调整(缩放)文本的大小。将文本转换为图像也很好,因为我可以获得它的尺寸并设置文本实体本身的大小 基

我正在使用基于实体的Java制作一个2d引擎。物理和精灵已经完成,但我仍然需要能够使用
BaseText
类绘制文本。出于实验目的,我在
渲染器
类中使用了以下代码(用于绘制所有精灵等):

但是,我希望能够将此代码移动到
BaseText
实体的
setText(最终字符串文本)
方法中,即,当它被调用时,将创建一个包含指定文本的新图像(可能使用不同的字体和大小等,我尚未决定)

我的问题是:我希望能够根据自己的喜好调整(缩放)文本的大小。将文本转换为图像也很好,因为我可以获得它的尺寸并设置文本实体本身的大小

基本上,我需要的是以下几点:

  • 获取所需字符串并将其输入
    setText
    方法
  • 取字符串并将其绘制到图像上,调整大小以使文本完全适合它
  • 将此新图像设置为实体中的
    image
    字段,以便引擎可以绘制它
  • 这可能吗?使用
    FontMetrics
    类或任何调用它的方法都可以做到这一点,但我不太确定,因为我以前没有使用过它

    编辑:让我澄清一下:我想根据设置为特定字体和大小的某些文本的大小创建BuffereImage,而不是根据图像大小调整文本大小

    编辑2:多亏了Andrew这个家伙,他非常慷慨地提供了代码,我才能够为引擎添加一些代码,当然,这些代码应该可以正常工作。然而,即使有了drawRect,图像也不是保持透明就是没有被绘制出来。让我来提供一些面包屑-

    愚蠢的是,所有其他精灵和图像等都画得很好,所以我不确定它怎么可能是渲染器。 顺便说一下,这就是paint()方法

    编辑3:

    嗯…

    哦,天哪。
    我是……

    文字无法解释我用左手手掌在脸上系腰带有多用力

    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()));
    }
    
  • 使用或首选大小a
    JLabel
    (便于获取显示格式化文本所需的大小)
  • 在步骤1中调整字体大小,直到合适为止。调用
    BufferedImage.createGraphics()
    以获取
    Graphics2D
    对象。将
    字符串绘制为该对象
  • 我不理解第三点,所以不发表评论

  • 下面是它如何与
    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)));
                }
            });
        }
    }
    

    我想我的意思是:哦,天哪,我点击了enter y u,所以不是multiline。无论如何,我的意思是,我希望事先有字体、大小等,然后创建适合文本的BuffereImage本身。我想你可以将BuffereImage与ArrayList进行比较,因为图像的大小可以显式地保存文本,这就是already设置为一个大小…我说得通吗?我的回答似乎涵盖了你说的任何道理。编辑OP以寻找可能的解决方案。(我讨厌被剥夺睡眠)由于更多问题,请再次编辑OP。生命对于尝试破译代码片段来说太短了。为了更快地获得更好的帮助,请发布一个。请学习Java术语,并始终如一地使用它。“文本不会显示。”它可能被写到图像可见区域上方的某个点上。有关示例,请参阅我的答案。
    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)));
                }
            });
        }
    }