当前位置: 首页 > news >正文

0101中文乱码-BufferedImage-图片处理

文章目录

      • 1、问题描述
      • 2 、电子证书生成
      • 3、中文乱码原因及修复
      • 4、思考
    • 结语

1、问题描述

接手维护一个休闲赛事类项目,因为服务器到期,项目从云服务器迁移到本地服务器。

项目生成比赛,分为二人组、三人组等等的团体;比赛设置几个赛点,每个赛点扫描二维码,完成比赛后,由管理人员生成完赛证明和完赛证书(电子图片)。

在项目迁移完成后,发现生成的图片中表示队伍和人名的中文文字乱码了,如下图所示:

在这里插入图片描述

2 、电子证书生成

生成图片源代码如下所示:

 public static boolean certImageTo2(String backgroundPath, String outPutPath, Map<String, Object> fontMap) throws IOException {
//        int width = 2404;//2021int width = 1309;//2022
//        int height = 1000;//2021int height = 992;//2022// 设置背景图片大小BufferedImage backgroundImage = resizeImage(width, height, ImageIO.read(new File(backgroundPath)));// 设置二维码图片大小Graphics2D g2d = backgroundImage.createGraphics();//消除文字锯齿g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//消除画图锯齿g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//队员String memberName = String.valueOf(fontMap.get("memberName"));int nameWidth = 315;int nameHeight = 574;int fontSize = 20;if (memberName != null) {if (memberName.length() == 2) {nameHeight = nameHeight + 10;}else if (memberName.length() == 4) {nameHeight = nameHeight - 12;}else if (memberName.length() == 5) {nameHeight = nameHeight - 16;fontSize = 16;nameWidth = nameWidth + 2;} else if (memberName.length() > 5) {//最多支持7个字nameHeight = nameHeight - 20;fontSize = 12;nameWidth = nameWidth + 4;}}
//        fontMap.put("memberName", "a");//temp test code
//        Font font = new Font("LiSu", Font.BOLD, fontSize);Font font = new Font("宋体", Font.BOLD, fontSize);g2d.setColor(new Color(0, 0, 0));g2d.setFont(font);shuPaiWenzi(nameWidth, nameHeight, 0, String.valueOf(fontMap.get("memberName")), g2d);//小时
//        font = new Font("LiSu", Font.PLAIN, 24);font = new Font("宋体", Font.PLAIN, 24);g2d.setColor(new Color(0, 0, 0));g2d.setFont(font);g2d.drawString(String.valueOf(fontMap.get("hour")), 288, 761);//分
//        font = new Font("LiSu", Font.PLAIN, 24);font = new Font("宋体", Font.PLAIN, 24);g2d.setColor(new Color(0, 0, 0));g2d.setFont(font);int x = 288;int minute = Integer.valueOf(String.valueOf(fontMap.get("minute")));Console.log("==========minute" + minute);if (minute >= 10) {x = x - 6;}g2d.drawString(String.valueOf(fontMap.get("minute")), x, 824);//秒
//        font = new Font("LiSu", Font.PLAIN, 24);font = new Font("宋体", Font.PLAIN, 24);g2d.setColor(new Color(0, 0, 0));g2d.setFont(font);x = 288;int second = Integer.valueOf(String.valueOf(fontMap.get("second")));Console.log("==========second" + second);if (second >= 10) {x = x - 6;}g2d.drawString(String.valueOf(fontMap.get("second")), x, 890);// 释放g2d.dispose();// 输出新的图片return ImageIO.write(backgroundImage, "jpg", new File(outPutPath));}
  • BufferedImage为内存图形对象,加载背景图重新设置宽高。
  • Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。
  • 这里我们通过Graphics2D在背景图对应位置设置字符串来生成精美的电子证书。
  • 字符串可以设置字体、颜色、大小等等。

3、中文乱码原因及修复

问题分析:

  • 首先我们直接迁移的war包,程序是没有动过的。
  • 图片正常生成,英文字符串也正常生成,只有中文乱码。
  • 这里我们猜测可能出现问题地方
    • 是不是数据库排序规则问题
    • 是不是和系统环境有关?(具体什么呢?)

本地运行代码:

  • 代码在本地测试正常的,排除数据库问题

上网搜索之后,确定一个方向和Linux没有安装中文字体是否有关?

因为是线上系统,不可能仅凭一个猜测就去搞测试,那我们就自己准备一个云服务器,来还原问题。

第一步:不按照中文字体,运行程序,结果中文乱码。

第二步:安装中文字体,参考下面链接1,因为程序中使用“宋体”和“隶书”,我们直接把本地的这两种字体安装上,重新运行程序,结果正常。

  • 安装中文字体后,一定要重启程序,不然不生效。

最终确认是由于本地服务器未安装相应的中文字体导致的

4、思考

如何让我们的内容正好对应我们的背景图中预留位置呢?你适配了某个比赛的背景,我其他比赛需要做不同的背景图,长宽比例,位置可能变动?

结语

❓QQ:806797785

⭐️仓库地址:https://gitee.com/gaogzhen

⭐️仓库地址:https://github.com/gaogzhen

[1]centos7安装字体和中文字体[CP/OL].

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搭载海光3350处理器的高速流量处理模块(用于高速网络数据处理设备应用)
  • Java设计模式-抽象工厂模式-一次性理解透
  • 爬虫配置代理:保护隐私有效地抓取数据
  • C#多线程并发编程深度探索:解锁async、await、Task与lock等关键字的奥秘
  • 【生成式人工智能-八-大型语言模型的能力评估】
  • JAVA集中学习第五周学习记录(二)
  • Spring Boot 快速入门样例【后端 3】
  • Linux Shell实例
  • Python 通过UDP传输超过64k的信息
  • 深度学习入门案例:运用神经网络实现价格分类
  • linux中守护进程管理方式
  • 【学习笔记】Day 14
  • 和等于 k 的最长子数组长度(LeetCode)
  • MySQL windows版本安装
  • How do you implement OpenAI GPT-3 Api Client in PHP?
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • eclipse的离线汉化
  • HTML中设置input等文本框为不可操作
  • js数组之filter
  • maya建模与骨骼动画快速实现人工鱼
  • Mysql优化
  • PAT A1092
  • React+TypeScript入门
  • Redis在Web项目中的应用与实践
  • Spring Cloud Feign的两种使用姿势
  • SpriteKit 技巧之添加背景图片
  • TypeScript迭代器
  • Webpack 4x 之路 ( 四 )
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 浮现式设计
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #162 (Div. 2)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (6)STL算法之转换
  • (a /b)*c的值
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (c语言+数据结构链表)项目:贪吃蛇
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (补)B+树一些思想
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (实战篇)如何缓存数据
  • (五)Python 垃圾回收机制
  • (一)SvelteKit教程:hello world
  • .NET BackgroundWorker
  • .Net CF下精确的计时器
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 回调、接口回调、 委托
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • ??在JSP中,java和JavaScript如何交互?
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [\u4e00-\u9fa5] //匹配中文字符