Java 1.6 Graphics2D : Rendering text into a box

标签 java swing graphics graphics2d

我正在寻找一种简单的方法来将字符串渲染到 JPG 中的矩形框中,而该文本框应该自动发生换行。

这可以通过 Graphics2D 实现吗?

在单行上渲染字符串很容易,以下代码片段使用抗锯齿以及良好的 JPG 输出压缩质量:

BufferedImage img = ImageIO.read(new File(".../input.jpg"));
int width = img.getWidth();
int height = img.getHeight();

Color zgColor = new Color(0xAB,0x3C,0x2E);
Color grey = new Color(0xCC,0xCC,0xCC);

BufferedImage bufferedImage = new BufferedImage(width, height, img.getType());
Graphics2D g = bufferedImage.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// draw graphics
g.drawImage(img, 0, 0, null);
g.setColor(zgColor);
int y = 900;
int x = 50;
g.setFont(new Font("Arial", Font.BOLD, 80));
g.drawString("Demo Text", x, y);

y+=80;
g.setColor(Color.WHITE);
g.setFont(new Font("Arial", Font.BOLD, 60));
g.drawString("Some other text a bit below", x, y);

y+=400;
g.setFont(new Font("Arial", Font.BOLD, 30));
g.setColor(Color.WHITE);
g.drawString("AND THIS WOULD BE THE TEXT I'D LIKE TO FIT INTO A BOX WITH AUTOMATIC LINE BREAKS", x, y);

g.dispose();

// Save as high quality JPEG
File targetFile = new File(".......result.jpg");
//ImageIO.write(bufferedImage, "jpg", targetFile); // this would give bad quality!

Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter)iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1); // best quality
FileImageOutputStream output = new FileImageOutputStream(targetFile);
writer.setOutput(output);
IIOImage image = new IIOImage(bufferedImage, null, null);
writer.write(null, image, iwp);
writer.dispose();            
System.out.println("Done.");

最佳答案

查看LineBreakMeasurer。该 API 有一些示例代码可以帮助您入门。

或者另一种方法是使用您的图像创建 JLabel。然后,您可以将 JTextArea 添加到标签并设置包装属性。然后,当您将文本区域添加到标签时,文本将自动换行。您需要手动设置标签内文本区域的边界以控制文本的位置。

关于Java 1.6 Graphics2D : Rendering text into a box,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8260008/

相关文章:

algorithm - 您如何找到距直线给定垂直距离的点?

c++ - 栅格化二维多边形

java - 调用已存储在 ArrayList 中的对象的方法

java - 将实例变量公开给其他类的正确方法

java - 为一个 JButton 提供两种不同的操作

java - 如何处理组合框中的超长文本项

Java 面板向下滚动

java - 带 setBounds 的 drawLine 组件

java - Spring中使用密码编码时用户登录失败

java - JComponent 子类未出现