又是一年春来到,快来围观用Java代码写春联

2024-02-03 20:20

本文主要是介绍又是一年春来到,快来围观用Java代码写春联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. 说明
    • 2. 示例
      • 示例1-单字模式
      • 示例2-春联模式
    • 3. 前期准备
    • 4. 代码实现
    • 5. 结语

1. 说明

        用Java代码写春联,本质上就是在一张背景图上写字,主要用到两个用于图形处理和图像读写的重要类库,分别是Graphics和ImageIO。Graphics类是一个抽象类,提供了绘图相关的方法,用于在组件上进行绘制操作,通过Graphics 类的实例,可以绘制各种几何形状、文本和图像,设置颜色、字体、线条样式等。ImageIO类可以从文件或输入流中读取图像,并将图像以不同的格式写入到文件或输出流中,简化了图像的读取和写入过程,并支持多种图片格式,如 JPEG、PNG、GIF等。实现代码中提供了两种模式,一种是“单字模式”的,如“福”字,一种是“春联模式”的。

2. 示例

示例1-单字模式

在这里插入图片描述

示例2-春联模式

在这里插入图片描述

3. 前期准备

准备两张喜庆一些的背景图,h_bg是水平图 ■,v_bg是垂直图 ◆

在这里插入图片描述

字体的大小与定义背景的尺寸一定要符合标准,比例不能失衡了,不然会显得字太小或者字太大

字体可以按照实际需求更换,字的颜色也可以按照需求更换

4. 代码实现

public class Test3 {//设置单图大小private final static Integer PIC_SIZE = 640;//背景图片类型 v:垂直背景图 h:水平背景图private static String BACK_TYPE;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请选择类型:【1】单字、【2】春联");String type = scanner.nextLine();if ("1".equals(type)) {BACK_TYPE = "v";System.out.println("请输入单字:");String singleWord = scanner.nextLine();if (singleWord.length() != 1) {System.out.println("非单字类型,写出失败!");return;}writeSingleWord(singleWord);System.out.println("写出完成!");}if ("2".equals(type)) {BACK_TYPE = "h";System.out.println("请输入横批:");String title = scanner.nextLine();System.out.println("请输入上联:");String infoLeft = scanner.nextLine();System.out.println("请输入下联:");String infoRight = scanner.nextLine();writeCouplet(title, infoLeft, infoRight);System.out.println("写出完成!");}}//单字public static void writeSingleWord(String word) {//图上绘写文字BufferedImage image = new BufferedImage(PIC_SIZE, PIC_SIZE, BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();g.drawImage(writeH(word), 0, 0, PIC_SIZE, PIC_SIZE, null);//文字绘写完成之后,进行文件输出try {String path = ResourceUtil.getFilePath()+word+"_"+System.currentTimeMillis()+".png";ImageIO.write(image, "png", new File(path));System.out.println("文件位置:"+path);} catch (IOException e) {e.printStackTrace();}}//对联public static void writeCouplet(String title, String infoLeft, String infoRight) {//图上绘写文字BufferedImage image = new BufferedImage(PIC_SIZE * 4, PIC_SIZE + PIC_SIZE * infoLeft.length(), BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();g.drawImage(writeH(title), 0, 0, PIC_SIZE * 4, PIC_SIZE, null);g.drawImage(writeV(infoLeft), PIC_SIZE / 2, PIC_SIZE, PIC_SIZE, PIC_SIZE * infoLeft.length(), null);g.drawImage(writeV(infoRight), 3 * PIC_SIZE-(PIC_SIZE / 2), PIC_SIZE, PIC_SIZE, PIC_SIZE * infoRight.length(), null);//文字绘写完成之后,进行文件输出try {String path = ResourceUtil.getFilePath()+"春联_"+title+"_"+System.currentTimeMillis()+".png";ImageIO.write(image, "png", new File(path));System.out.println("文件位置:"+path);} catch (IOException e) {e.printStackTrace();}}//横批public static BufferedImage writeH(String text) {char[] ch = text.toCharArray();BufferedImage image = new BufferedImage(PIC_SIZE * ch.length, PIC_SIZE, BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();for (int i = 0; i < ch.length; i++) {char c = ch[i];g.drawImage(fontMark(String.valueOf(c)), PIC_SIZE * i, 0, PIC_SIZE, PIC_SIZE, null);}g.dispose();return image;}//上下联public static BufferedImage writeV(String text) {char[] ch = text.toCharArray();BufferedImage image = new BufferedImage(PIC_SIZE, PIC_SIZE * ch.length, BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();for (int i = 0; i < ch.length; i++) {char c = ch[i];g.drawImage(fontMark(String.valueOf(c)), 0, PIC_SIZE * i, PIC_SIZE, PIC_SIZE, null);}g.dispose();return image;}/*** 文字标记* @param content 标记内容* @return*/public static BufferedImage fontMark(String content) {try {String baseStatic = ResourceUtil.getStaticPath();BufferedImage bufImg = "h".equals(BACK_TYPE) ? ImageIO.read(new File(baseStatic+"h_bg.png")) : ImageIO.read(new File(baseStatic+"v_bg.png"));Font font = new Font("华文行楷", Font.BOLD, 350);Graphics2D graphics = bufImg.createGraphics();
//            graphics.setColor(Color.black); //字体颜色可以自己选择 黑色字体graphics.setColor(new Color(255,215,0)); //金色字体graphics.setFont(font);graphics.drawString(content, 180, 450);graphics.dispose();return bufImg;} catch (IOException e) {e.printStackTrace();return null;}}
}

5. 结语

        基于春联的实现,其实可以拓展一下思路,是不是就可以实现在背景图上使用代码渲染文字了,是不是比P图来的方便的多。让程序在实际生活中也有了更多的色彩,最后祝大家在新的一年“龙行龘龘 前程朤朤”

这篇关于又是一年春来到,快来围观用Java代码写春联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/675301

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect