Base64字符 转图片乱码问题
网站做了个随机验证码图片功能,遇到了一个奇怪的问题——Base64字符集转图片乱码问题,问题描述如下
1.用java画笔将随机验证码绘制成图片
2.再将图片的二进制代码转换成Base64字符集,返回给前端,
以上步骤,在本地window环境下,随机验证码图片生成base64字符传送到前端,能完美解析出来,但是部署到生产环境(centos)上,则解析base64字符得到的是一张乱码图片。
经过初步分析,应该是系统环境差异造成的,
1.一开始以为是字符编码和解码的问题,但base64本身是用ascii字符集,本身不存在编码集不对的问题。所以排除字符集解码和编码不对的问题。
2.接着,检查了下生成的base64字符的长度,2207个字符,远没达到string的最大字符长度。
3.那么有没有可能是绘制的图片本身就是乱码的,base64字符还原出的图片是没问题的。因此仔细看下绘制随机验证码的代码
public static String outputRandomImageDataUrl(String randomString)
throws IOException {
int width = 100;
int height = 30; Color color = getRandomColor();
Color reverse = getReverseColor(color); BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
g.setColor(color);
g.fillRect(0, 0, width, height);
g.setColor(reverse);
g.drawString(randomString, 18, 20);
for (int i = 0, n = random.nextInt(100); i < n; i++) {
g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
} return DATAURL_PREFIX + ImageConvertUtils.imageConvertBase64(bi);
}
然后发现这句
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
字体是微软雅黑字体,linux系统已办是肯定是不会有这个字体的,于是本人在生产环境检查了下系统字符集,果然没有,找到问题所在,那么就很好解决了。
1.程序代码中选择一个生产环境已有的字体。
2.安装程序指定的字体。
本人是采用第二种方式,安装了微软雅黑字体后果然ok了
Base64字符 转图片乱码问题的更多相关文章
- Base64 字符串转图片 问题整理汇总
前言 最近碰到了一些base64字符串转图片的开发任务,开始觉得没啥难度,但随着开发的进展还是发现有些东西需要记录下. Base64 转二进制 这个在net有现有方法调用: Convert.FromB ...
- BASE64编码的图片在网页中的显示问题的解决
BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='base64编码'/>的方式显示 Base64 在CSS中的使用 .demoIm ...
- C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决
最近用base64编码传图片遇到了点问题,总结下. 首先总结下base64编码的逻辑,来自网络:https://www.cnblogs.com/zhangchengye/p/5432276.html ...
- base64转换成图片
前端代码JS: 前端图片为canvsa绘图转base64格式 function putTextInfo() { var canvasImg = painting.canvas.toDataURL('i ...
- 解码base64加密的图片并打印到前台
经过base64加密的图片对象是一串字符串,我们解码后可通过流将其打印出来: utils类: package com.aebiz.app.web.modules.controllers.open.ap ...
- base64格式的图片数据如何转成图片
base64格式的图片数据如何转成图片 一.总结 一句话总结:不仅要去掉前面的格式串,还需要base64_decode()解码才行. // $base_img是获取到前端传递的值 $base_img ...
- FromBase64String 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符
js前台: <input id="upload_img_input" v-on:change="onFileChange" type="file ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- Base-64 字符数组或字符串的长度无效等问题解决方案
项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...
随机推荐
- Oracle常用sql命令
1.查看数据库归档是开启还是关闭SQL> archive log list 更改数据库归档模式: SQL> shutdown immediateSQL> startup mountS ...
- css清除浮动方式总结
1.通过父元素overflow:hidden,缺点:超出部分隐藏,不推荐使用 <!DOCTYPE html> <html lang="en"> <he ...
- linux中sed命令批量修改
sed命令下批量替换文件内容 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` 文件名 -i 表示inplace edit,就地修改文件 ...
- 52 和 52Rc 通过IIC写入数据
- 安装oracle11g client 【INS-30131】执行安装程序验证所需的初始设置失败的解决方法
今天在服务器(操作系统windows server 2008R2)上安装Oracle11g 客户端,弹出“执行安装程序验证所需的初始设置失败”,如上图.网上找了一些方法,简单整理如下,仅供参考. 问题 ...
- python网络编程(图片传输)
发送端: from socket import * s=socket() s.connect(('127.0.0.1',8888)) f=open('mm.jpg','rb') while True: ...
- Openresty 进行限流的方法
1.使用Openresty进行限流, 使用漏桶原理进行设计 和路由系统设计类似. LUA脚本去通过变量去redis取值,从redis中得到队列的大小.漏和桶的大小. 然后通过比较,队列大小与漏和桶进行 ...
- oracle的PDB启动
/*以管理员身份登录*/sqlplus / as sysdba /*查看CDB的状态*/select status from v$instance; /*开启startup,默认是open*/star ...
- PHP 位运算
$a & $b a,b二进制后,取得每对应为都有1的部分,然后再转换为十进制 $a | $b a,b二进制后,取得每对应为只要有1的部分,然后再转换为十进制 $a >&g ...
- JavaScript构造函数原理
1.var obj={} plainObject 对象字面量/对象直接量2.构造函数创建 1).系统自带的构造函数 Object() var obj=new Object(); 和 var obj = ...