596 字
3 分钟
渲染文字到图片中
导入包:
import java.awt.image.BufferedImageimport java.awt.*import java.io.Fileimport javax.imageio.ImageIO创建空白图片并渲染文字
@main def drawTextOnImage(): Unit = { // 创建一个空白图片 val width = 500 val height = 500 val bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)
// 获取图片的 Graphics2D 对象 val g2d: Graphics2D = bufferedImage.createGraphics()
// 启用抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
// 设置背景颜色并清空图片 g2d.setColor(Color.WHITE) g2d.fillRect(0, 0, width, height)
// 设置文字颜色和字体 g2d.setColor(Color.BLACK) g2d.setFont(new Font("LXGW WenKai Screen", Font.PLAIN, 28))
// 在图片上绘制文字 val text = "你好世界" val x = 100 val y = 100 g2d.drawString(text, x, y)
// 释放 Graphics2D 对象 g2d.dispose()
// 保存图片到文件 val outPutFile = new File("src/main/scala/img/output.png") ImageIO.write(bufferedImage, "png", outPutFile)
println("保存成功!")}加载已有图片并渲染文字
@main def addTextToImage(): Unit = { // 读取已有的图片 val inputFile = new File("src/main/scala/img/input.jpg") val bufferedImage = ImageIO.read(inputFile) // 获取图片的 Graphics2D 对象 val g2d: Graphics2D = bufferedImage.createGraphics()
// 启用抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
// 标题和内容 // val title = "大凶" // val content = "内心丰富多彩的一天"
val title = "全体運" val content = "能用善良的语言让周围的人感到幸福的日子"
// 获取图片的宽度和高度 val imgWidth = bufferedImage.getWidth / 2 val imgHeight = bufferedImage.getHeight
// 根据百分比计算标题的位置 val titleX = title.length match case length if length == 3 => (imgWidth * 0.39).toInt case length if length >= 2 => (imgWidth * 0.46).toInt case _ => (imgWidth * 0.525).toInt val titleY = 108
// 设置文字颜色和字体 // g2d.setColor(Color(255, 255, 255)) g2d.setFont(new Font("LXGW WenKai Screen", Font.PLAIN, 30))
// 创建渐变色 var gradient = GradientPaint( // 起始点和颜色 titleX, titleY, Color.RED, // 结束点和颜色 titleX + 100, titleY, Color.BLUE )
// 设置渐变色为绘图颜色 g2d.setPaint(gradient)
g2d.drawString(title, titleX, titleY)
// 根据百分比计算内容的起始位置 var contentX = content.length match case length if length >= 19 => (imgWidth * 0.39).toInt case length if length >= 10 => (imgWidth * 0.47).toInt case _ => (imgWidth * 0.54).toInt var contentY = (imgHeight * 0.4).toInt
// g2d.setColor(Color(50, 50, 50)) g2d.setFont(new Font("LXGW WenKai Screen", Font.PLAIN, 23))
// 获取行高 val lineHeight = g2d.getFontMetrics.getHeight
// 绘制内容(竖着排列并根据内容长度适当换行) val colorX = contentX val colorY = contentY for (char <- content) { gradient = GradientPaint( colorX, colorY, Color(0, 0, 0), contentX, contentY + 200, Color(250, 208, 196) ) g2d.setPaint(gradient) g2d.drawString(char.toString, contentX, contentY) contentY += lineHeight if (contentY >= (imgHeight * 0.9).toInt) { contentY = (imgHeight * 0.4).toInt contentX += (imgWidth * 0.15).toInt } }
// 释放 Graphics2D 对象 g2d.dispose()
// 保存图片到文件 val outPutFile = new File("src/main/scala/img/output.jpg") ImageIO.write(bufferedImage, "jpg", outPutFile)
println("保存成功!")}