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

news2024/11/17 3:38:07

文章目录

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

1、问题描述

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

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

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

在这里插入图片描述

2 、电子证书生成

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

 public static boolean certImageTo2(String backgroundPath, String outPutPath, Map<String, Object> fontMap) throws IOException {
//        int width = 2404;//2021
        int width = 1309;//2022
//        int height = 1000;//2021
        int 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].

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

判断矩阵中的一致性检验是指什么

判断矩阵中的一致性检验通常指的是在层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;中&#xff0c;用于评估决策者在构造判断矩阵时的逻辑一致性。 在AHP中&#xff0c;决策者需要比较成对的因素&#xff0c;并为每对因素的相对重要性赋予一个数值&#…

什么是haproxy七层代理

一.负载均衡 1.1.什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;从…

DriftingBlues2靶机渗透测试

DriftingBlues2靶机 文章目录 DriftingBlues2靶机信息收集FTP渗透web渗透权限提升靶机总结 信息收集 nmap扫描得到21,22和80端口&#xff0c;其中21ftp协议可以使用匿名用户登录 使用目录扫描一下网站&#xff0c;得到了blog目录 FTP渗透 匿名用户登录进去&#xff0c;发现…

QT移除窗体的最大化和最小化按钮

效果 代码位置 代码 int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.setWindowFlags(w.windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);w.show();return a.exec(); }

考研数学想考120,把李林880做到准确率80%以上够吗?

考研数学想考120&#xff0c;把880题做到正确率80%以上是不够的 因为最近几年的考研数学变化&#xff0c;很大&#xff0c;传统的背题型的备考方式已经没用了&#xff0c;而880题是这种模式的佼佼者&#xff0c;25版的880变动又很小&#xff0c;只加了40道比较综合的题目在每一…

python基础命令学习

1.Python基础知识 目录 1.Python基础知识1.1 变量及类型1.2 标识符与关键字1.3 输出与输入1.3.1格式化符号1.3.2转义字符1.3.3结束符1.3.4输入的特点 1.4 运算符1.4.1 算数运算符1.4.2 赋值运算符1.4.3 比较(即关系)运算符1.4.4 逻辑运算符 1.5 数据类型转换1.6 判断与循环语句…

【K8S系列】Kubernetes基础介绍

一、前言 搭建完k8s集群后&#xff0c;正式进入k8s相关知识点的理论了解。并结合官方文档逐步总结涉及k8s各类知识点&#xff0c;希望能对正在学习的或将要学习得到小伙伴有所帮助。 二、系统部署历程回顾 传统部署时代&#xff1a; 早期&#xff0c;各个组织是在物理服务器…

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中&#xff0c;我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能&#xff0c;并提供代码示例来演示其用法。 什么是UI自动化&#xff1f; UIAutomation是一个…

Java中常用的设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

&#x1f496; 前言&#xff1a;探索数据矿藏1. &#x1f4ca;数据获取与预处理&#xff1a;AI大模型的燃料1.1 &#x1f310;数据获取&#xff1a;多样性与规模并重1.2 &#x1f9f9;数据清洗与处理&#xff1a;提升数据质量1.3 &#x1f50d;特征工程&#xff1a;挖掘数据的深…

稠密检索的规模艺术:模型、数据与性能的精准匹配

论文&#xff1a;https://arxiv.org/pdf/2403.18684代码&#xff1a;GitHub - jingtaozhan/DRScale机构&#xff1a;清华大学领域&#xff1a;稠密检索、Scaling Laws发表&#xff1a;SIGIR2024最佳论文 Abstract Scaling Laws已经在广泛的任务中被观察到&#xff0c;特别是在…

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中&#xff0c;重复声明同一个变量会导致变量冲突&#xff0c;在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中&#xff0c;闭包是指封闭的执行环境&#xff…

“论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师

论文真题 RUP&#xff08;Rational Unified Process&#xff09;是IBM公司的一款软件开发过程产品&#xff0c;它提出了一整套以UML为基础的开发准则&#xff0c;用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华&#xff0c;提供了一…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器&#xff1a;抓包过滤器 和 显示过滤器。 抓包过滤器&#xff1a; 抓取满足过滤条件的数据包&#xff0c;不满足过滤条件的数据包不会被抓取。 显示过滤器&#xff1a; 包已…

C语言基础⑩——构造类型(结构体)

一、数据类型分类 1、基本类型 整数型 短整型&#xff1a;short&#xff08;2个字节&#xff09;&#xff1b;整型&#xff08;默认&#xff09;&#xff1a;int&#xff08;4个字节&#xff09;&#xff1b;长整型&#xff1a;long&#xff08;8个字节&#xff09;&#xf…

延迟队列插件

3.10 1.在opt文件夹里建一个rabbitmq文件夹,把插件放进去 2.拷贝到容器内plugins目录下&#xff08;rabbitmq是容器的name&#xff0c;也可以使用容器id&#xff09; docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins 进入 Docker 容器…

Java面试八股之什么是JMS

什么是JMS JMS&#xff08;Java Message Service&#xff09;是Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在分布式环境中发送和接收消息。JMS API提供了一种标准的、与供应商无关的方式&#xff0c;使得Java应用程序能够创建、发送、接收…

分布式数据库在传统车联网厂商的应用实践 | OceanBase案例

本文作者&#xff1a;慧视通科技&#xff0c;梁君 传统车联网厂商运维百亿级数据的痛点与难点 深圳慧视通科技&#xff08;简称慧视通&#xff09;作为专业的位置数据综合运营服务提供商&#xff0c;一直深耕智能交通领域&#xff0c;依托车联网、云计算、大数据处理、无线通信…

【STM32+HAL】杆球控制系统

一、前言 2017年电赛出了道板球控制系统题目&#xff0c;现写一个简化版本——杆球控制系统&#xff0c;以此记录电赛集训生活。 二、题目分析 最终采取的方案是&#xff1a;OpenMV读取小球的当前位置&#xff0c;并将坐标值传给STM32端&#xff0c;再由32通过电机改变杆的位置…

Proxmox 8.1.3 系统安装堡塔云 waf 防火墙

堡塔云 waf 工作原理&#xff1a; 堡塔云 waf 是一款Web应用防火墙&#xff0c;区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 堡塔云 waf 采用半容器化部署&#xff0…