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