将文本内容转换为图像

有没有允许将文本内容转换为图像文件的Java库? 我只知道ImageMagick (在这种情况下是JMagick)但我不想安装任何外部二进制文件(我的应用程序将在Tomcat服务器中部署为.war文件,因此我不希望任何其他依赖项比Java更多) 。

例如,从字符串“Hello”,我想生成这个简单的图像:

字符串“hello”的基本图像

Graphics 2D API应该能够实现您的需求。 它还具有一些复杂的文本处理function。

在此处输入图像描述

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

另请参阅写作/保存和图像

没有任何外部库,请执行以下操作:

  1. 以像素为单位测量文本大小(请参阅测量文本 )
  2. 为文本创建一个合适大小的java.awt.image.BufferedImage
  3. 使用createGraphics()方法获取BufferedImage的图形对象
  4. 画出文字
  5. 使用javax ImageIO类保存图像

编辑 – 修复了链接

请考虑以下代码段:

 public static final HashMap RenderingProperties = new HashMap<>(); static{ RenderingProperties.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); RenderingProperties.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); RenderingProperties.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); } public static BufferedImage textToImage(String Text, Font f, float Size){ //Derives font to new specified size, can be removed if not necessary. f = f.deriveFont(Size); FontRenderContext frc = new FontRenderContext(null, true, true); //Calculate size of buffered image. LineMetrics lm = f.getLineMetrics(Text, frc); Rectangle2D r2d = f.getStringBounds(Text, frc); BufferedImage img = new BufferedImage((int)Math.ceil(r2d.getWidth()), (int)Math.ceil(r2d.getHeight()), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setRenderingHints(RenderingProperties); g2d.setBackground(Color.WHITE); g2d.setColor(Color.BLACK); g2d.clearRect(0, 0, img.getWidth(), img.getHeight()); g2d.setFont(f); g2d.drawString(Text, 0, lm.getAscent()); g2d.dispose(); return img; } 

仅使用java Graphics API基于呈现在bufferedimage上的字体创建图像。

这是一个将图形内容写入png格式的简单程序。

 import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; import java.io.File; import javax.imageio.ImageIO; class ImageWriteEx extends JPanel{ public void paint(Graphics g){ Image img = createImageWithText(); g.drawImage(img, 20, 20, this); } private static BufferedImage createImageWithText(){ BufferedImage bufferedImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.getGraphics(); g.drawString("www.stackoverflow.com", 20, 20); g.drawString("www.google.com", 20, 40); g.drawString("www.facebook.com", 20, 60); g.drawString("www.youtube.com", 20, 80); g.drawString("www.oracle.com", 20, 1000); return bufferedImage; } public static void main(String[] args){ try{ BufferedImage bi = createImageWithText(); File outputfile = new File("save.png"); ImageIO.write(bi, "png", outputfile); } catch(Exception e){ e.printStackTrace(); } JFrame frame = new JFrame(); frame.getContentPane().add(new ImageWriteEx()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,300); frame.setVisible(true); } }