【问题标题】:Writing String into a image in java在java中将字符串写入图像
【发布时间】:2013-02-04 20:08:17
【问题描述】:

我正在尝试使用ImageIo 将字符串写入图像。但是在写入大字符串时,不会将完整字符串写入该图像。

这是我的代码:

File url=new File(imgUrl);

BufferedImage image = ImageIO.read(url);

Graphics g = image.getGraphics();
g.setPaintMode();
g.setFont(g.getFont().deriveFont(30f));
g.drawString(text, 100, 100);
g.dispose();

此代码适用于小字符串。但是当字符串的宽度超过图像的宽度时,该图像上不会显示完整的字符串。

有什么建议吗?

【问题讨论】:

  • “此代码适用于小字符串。但是当字符串的宽度超过图像的宽度时,该图像上不会显示完整的字符串” - 这很明显。你的问题是什么?您的预期行为是什么?
  • 拆分字符串并写在多行。

标签: java javax.imageio


【解决方案1】:

我有一个旧方法尝试一下

public BufferedImage stringToImage(String text, Font font, Color bgColor, Color fgColor) {
    BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    FontRenderContext fc = g2d.getFontRenderContext();
    Rectangle2D bounds = font.getStringBounds(text, fc);

    //calculate the size of the text
    int width = (int) bounds.getWidth();
    int height = (int) bounds.getHeight();

    image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    g2d = (Graphics2D) image.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setFont(font);

    g2d.setColor(bgColor);
    g2d.fillRect(0, 0, width, height);
    g2d.setColor(fgColor);
    g2d.drawString(text, 0, (int)-bounds.getY());
    g2d.dispose();

    return image;
}

并使用

BufferedImage image = stringToImage(text, font, bgColor, fgColor);
ImageIO.write(image, "jpg", file);

【讨论】:

    【解决方案2】:

    未测试,但可以这样做:

    JLabel label = new JLabel("<html><h2>Title</h2><p>large text ...</p>");
    int w = image.getWidth();
    int h = image.getHeigth();
    label.setBounds(0, 0, w, h);
    SwingUtilities.paintComponent(g, label, null, 0, 0, w, h);
    

    【讨论】:

      【解决方案3】:

      有很多方法可以实现这一点。

      • FontRenderContext/GlyphVector 如 pbaris 所述。例如,请参阅this answer
      • FontMetricsthis answer 所示。
      • 一个JLabel(可能是多行)来包含和调整文本大小。正如 Joop E.G. 所提到的。 LabelRenderTest

      【讨论】:

        【解决方案4】:

        您可以使用 JTextArea 来布局文本:

        JTextArea textArea = new JTextArea(text);
        textArea.setFont(g.getFont().deriveFont(30f));
        textArea.setOpaque(false);
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        textArea.setBounds(0, 0, image.getWidth(), image.getHeight());
        textArea.paint(g);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-26
          • 2015-11-29
          • 2015-07-16
          • 2016-05-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          相关资源
          最近更新 更多