Graphics 2D API 应该能够满足您的需求。它也有一些复杂的文本处理能力。
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TextToGraphics {
public static void main(String[] args) {
String text = "Hello";
/*
Because font metrics is based on a graphics context, we need to create
a small, temporary image so we can ascertain the width and height
of the final image
*/
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
Font font = new Font("Arial", Font.PLAIN, 48);
g2d.setFont(font);
FontMetrics fm = g2d.getFontMetrics();
int width = fm.stringWidth(text);
int height = fm.getHeight();
g2d.dispose();
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g2d = img.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2d.setFont(font);
fm = g2d.getFontMetrics();
g2d.setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
try {
ImageIO.write(img, "png", new File("Text.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
也可以查看Writing/Saving and Image
警告我用它生成了 90k PNG 图片,结果发现它们可以在 IE 中查看,但不能在 Chrome 版本 70.0.3538.77 中查看
上面的代码对我来说很好用(我将文本颜色更改为WHITE,所以我可以在 chrome 中看到它)
我在使用 Java 10.0.2 的 Mac OS Mojave 10.14 上使用 Chrome 70.0.3538.77。生成的图像为 4778x2411 像素...
更新...
在 IE 上是白底黑字,但在 Chrome 上是黑底白字。但是我将背景设置为白色。
所以你告诉我的是,一个透明的 PNG 在不同的浏览器上显示不同,因为浏览器使用不同的默认背景......你为什么对此感到惊讶?
最初的解决方案故意使用基于透明的图像。这一点通过在创建图像时使用BufferedImage.TYPE_INT_ARGB 很明显,它应用了基于 Alpha (A) 的RGB 颜色模型。
这是出乎意料的,因为有 g2d.setBackground(Color.white)。
不,实际上,这完全是意料之中的,只要您了解setBackground 的实际作用以及应该如何使用它即可
来自JavaDocs
设置 Graphics2D 上下文的背景颜色。背景
颜色用于清除区域。构造 Graphics2D 时
对于组件,背景颜色是从组件继承的。
在 Graphics2D 上下文中设置背景颜色只会影响
随后的 clearRect 调用,而不是
零件。要更改组件的背景,请使用适当的
组件的方法。
从事物的“声音”来看,您需要一个不透明的图像,并带有填充的背景颜色。所以,再一次,它转到JavaDocs,稍微阅读一下就会把你带到BufferedImage.TYPE_INT_RGB,它删除了Alpha通道,但你仍然需要填充图像的背景。
为此,我会使用Graphics2D#setColor 和Graphics2D#fillRect,只是因为它有效。
所以,你最终会得到上面的修改版本,它可能看起来像......
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
g2d = img.createGraphics();
//...
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
g2d.setColor(Color.BLACK);
g2d.drawString(text, 0, fm.getAscent());
g2d.dispose();
try {
ImageIO.write(img, "png", new File("Text.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
如果我更改为“jpg”,我会在 IE 和 Chrome 上看到黑色背景上的橙色/粉红色文本
这与ImageIO 中一个众所周知的常见问题/错误有关,它试图将透明颜色模型的 Alpha 通道应用于不支持 Alpha 通道的 JPG。
详情请见Issue using ImageIO.write jpg file: pink background。
但基本的解决方案是要么使用支持 alpha 通道的 PNG,要么使用不透明的图像。
所以,这一切的长短是。问题不在于原始答案,也不在于ImageIO、BufferedImage、Graphics、AWT 库、Chrome 或 IE,而是因为您对这些 API(和示例)的工作原理缺乏了解。