【问题标题】:Create a image from text with background and wordwrap从带有背景和自动换行的文本创建图像
【发布时间】:2014-10-22 19:15:55
【问题描述】:

我需要将文本转换为图像。图片必须有:

  • 填充所有图像的白色背景。
  • 黑色文本。
  • 如果宽度/高度小于文本长度,则文本需要自动换行(可以根据字体大小变化)
  • 图像尺寸 125x125

我创建了这个函数来执行上述一些要求:

public static Image crearImagenDesdeTexto(String texto) throws IOException {
    BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();
    FontMetrics fm = g2d.getFontMetrics();
    int width = fm.stringWidth(texto);
    int height = fm.getHeight();
    g2d.setColor(java.awt.Color.WHITE);
    g2d.fillRect(0, 0, width, height);
    g2d.setColor(java.awt.Color.BLACK);
    Font font = new Font("Arial", Font.PLAIN, 12);
    g2d.setFont(font);
    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(java.awt.Color.BLACK);
    g2d.drawString(texto, 0, fm.getAscent());
    g2d.dispose();

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ImageIO.write((RenderedImage) img, "png", out);
    out.flush();
    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
    return new javafx.scene.image.Image(in);
}

我不知道是否存在更好的方法来应用正确的转换。

【问题讨论】:

    标签: javafx bufferedimage graphics2d


    【解决方案1】:

    怎么样

    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.image.WritableImage ;
    import javafx.scene.control.Label;
    
    // ...
    
    private static Image textToImage(String text) {
        Label label = new Label(text);
        label.setMinSize(125, 125);
        label.setMaxSize(125, 125);
        label.setPrefSize(125, 125);
        label.setStyle("-fx-background-color: white; -fx-text-fill:black;");
        label.setWrapText(true);
        Scene scene = new Scene(new Group(label));
        WritableImage img = new WritableImage(125, 125) ;
        scene.snapshot(img);
        return img ;
    }
    

    由于您想返回 javafx.scene.image.Image,因此最好将其尽可能多地保留在 JavaFX API 中。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2012-01-16
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多