效果展示
先看效果。原图较大,下图为压缩后的截图。
代码特点
值此新春佳节,用Java代码输出春联,也算是程序员迎接新春的一个练习。本文相对于其他的写春联的程序,有以下特点:
- 兼容任意对联的长度,而其他代码大部分只兼容7个字的长度;
- 兼容所有尺寸的背景图片;
- 示例的背景图片为自己原创设计;
- 横批与对联的大小比例更优,不是其他程序的1:2的比例。因此既方便打印,也在直接使用时,避免了比例失衡;
- 用Java实现,而其他程序大部分用Python实现;
- 代码规范,遵循了面向对象的编程思想;
实现方式
准备背景图片
要求正方形,边长像素在500以上,您可以使用纯红色图片,也可以使用带纹饰图案。我在网上没有找到合适的图片,就自己设计,以中国传统虎纹为基础,辅以花边和洒金斑点,并让学美术的妹妹制作了一个虎年专用的图案。
JAVA代码
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
public class Couplets {
//设置输出文件夹路径,请按您的实际需要进行修改
final static String resultDirPath = "C:\\Users\\巴山农夫\\桌面\\";
//设置背景图片文件位置,请按您的实际存放路径进行修改
final static String backgroundPath = "C:\\Users\\巴山农夫\\桌面\\background.jpg";
//设置字体。注意:大部分毛笔字体都涉及版权,如果商用需要取得授权。此代码为学习测试之用,非商用没有盈利,不涉及侵权。
static String fontName = "方正字迹-吕建德字体";
static BufferedImage background;
static int basicSize;
private String title;
private String coupletA;
private String coupletB;
//主方法便捷测试
public static void main(String[] args) throws IOException {
Couplets couplets = new Couplets();
//横批
couplets.setTitle("吃遍天下");
//上联
couplets.setCoupletA("火锅特辣十倍爽");
//下联
couplets.setCoupletB("奶茶少冰五分甜");
couplets.writeCouplets();
}
//书写对联
public void writeCouplets() throws IOException {
background = ImageIO.read(new File(backgroundPath));
basicSize = background.getWidth();
int coupletLength = coupletA.length();
int gapSize = 30;
// 算式前半部分的乘法不可以更改顺序,因为int的除法会抹除小数位,累计后的误差较大。
int imageHeight = basicSize * 3 / 2 * coupletLength + basicSize + gapSize * 2;
BufferedImage image = new BufferedImage(basicSize * 4, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
//修改背景颜色为红色
g.setColor(Color.RED);
g.fillRect(0, 0, image.getWidth(), image.getHeight());
g.drawImage(writeCouplet(title, true), 0, 0, basicSize * title.length(), basicSize, null);
g.drawImage(writeCouplet(coupletA, false), basicSize / 4, basicSize + gapSize, basicSize * 3 / 2, basicSize * 3 / 2 * coupletLength, null);
g.drawImage(writeCouplet(coupletB, false), basicSize * 9 / 4, basicSize + gapSize, basicSize * 3 / 2, basicSize * 3 / 2 * coupletLength, null);
try {
ImageIO.write(image, "jpg", new File(resultDirPath + title + ".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
//书写单句
private BufferedImage writeCouplet(String text, boolean horizontal) {
char[] ch = text.toCharArray();
BufferedImage image;
if (horizontal) {
image = new BufferedImage(basicSize * ch.length, basicSize, BufferedImage.TYPE_INT_RGB);
} else {
image = new BufferedImage(basicSize * 3 / 2, basicSize * 3 / 2 * ch.length, BufferedImage.TYPE_INT_RGB);
}
Graphics graphics = image.createGraphics();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (horizontal) {
graphics.drawImage(writeWord(String.valueOf(c), true), basicSize * i, 0, basicSize, basicSize, null);
} else {
graphics.drawImage(writeWord(String.valueOf(c), false), 0, basicSize * 3 / 2 * i, basicSize * 3 / 2, basicSize * 3 / 2, null);
}
}
graphics.dispose();
return image;
}
//书写单字
private BufferedImage writeWord(String content, boolean plus) {
BufferedImage bufImg = new BufferedImage(background.getWidth(), background.getHeight(), background.getType());
bufImg.setData(background.getData());
Font font = new Font(fontName, Font.PLAIN, plus ? basicSize : basicSize * 4 / 5);
Graphics2D graphics = bufImg.createGraphics();
graphics.setColor(Color.black);
graphics.setFont(font);
graphics.drawString(content, plus ? 0 : basicSize / 10, plus ? basicSize * 6 / 7 : basicSize * 4 / 5);
graphics.dispose();
return bufImg;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCoupletA() {
return coupletA;
}
public void setCoupletA(String coupletA) {
this.coupletA = coupletA;
}
public String getCoupletB() {
return coupletB;
}
public void setCoupletB(String coupletB) {
this.coupletB = coupletB;
}
}
更多推荐
Java代码写春联
发布评论