1.为什么要用到BASE64编码的图片信息

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输。由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下。最常见的用途是作为电子邮件或WebService附件的传输编码.

2.base64编码定义

目前的internet e-mail标准--简单邮件传递协议(smtp)在rfc821中规定了两条重要但不难实现的限制:

1)邮件的内容必须全部为7-比特的美国ascii码。

2)每一行的长度不能超过1000的字符。

因此为了通过smtp用e-mail进行传送,内存的序列化对象必须转化为和以上相容的格式。

rfc1521提供了一个可行的方案。它定义了邮件的内容部分,使之能包涵多种形式的数据。这种标准就是目前众所周知的mime。

按照rfc1521编码过程为:输入是24个比特,输出是4个字节。24个比特输入组从左至右 由3个8比特的输入组形成。这24个比特被看成4个连续的6比特组,而每个6比特输入组被翻译为base64码表中的一个数字。依次反复不断进行,直到全部输入数据转换完成。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

完整的base64定义可见 RFC1421和 RFC2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。

3.如何进行base64编码

Base64 使用US-ASCII子集的65个字符, 每个字符用6位表示

对于文本串,编码过程如下。例如"men":

先转成US-ASCII值.

"m"十进制 109

"e"十进制 101

"n"十进制 110

二进制 :

m 01101101

e 01100101

n 01101110

三个8位连起来是24位

011011010110010101101110

然后分成4个6位

011011 010110 010101 101110

现在得到4个值,十进制为

27 22 21 46

对应的 Base64 字符是 : b W V u

编码总是基于3个字符,从而产生4个Base64字符。

如果只是2个字符的数据,使用特殊字符"="补齐Base64的4字。

如,编码"me"

01101101 01100101

0110110101100101

011011 010110 0101

111111 (与,补足6位)

011011 010110 010100

b W U

b W U = ("=" 补足4字符)

于是 "bWU=" 就是"me"的Base64值.

如果只是2个字符的数据,如编码 "m"

01101101

011011 01

111111

011011 010000

b Q = =

于是 "bQ==" 就是"m"的Base64值.

4.显示被存储为Base64编码字符串的图片的例子

1)使用data: URI直接在网页中嵌入.

data: URI定义于IETF标准的RFC 2397

data: URI的基本使用格式如下:

data:[][;base64|charset=some_charset],

mime-type是嵌入数据的mime类型,比如png图片就是image/png。

如果后面跟base64,说明后面的data是采用base64方式进行编码的

这种方式,Firfox、Opera、Safari和Konqueror这些浏览器都已经支持,但是IE直到7.0版本都还没有支持.所以,比较好的做法是在服务器端将base64编码的字符串转换成byte流.这里,我提供了java的实现方法.

2)字符串转换成byte流,然后显示出来

在java中,提供了一个用于编码和解码(encode/decode )base64字符串和数据流的Java开源类库Java Base64.

服务器端代码

package test;

import java.io.*;

import java.text.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class ImgShow extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

String xmlImg="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

2pkxuQyiQjtI5U0Fwcjwr1RQFFFFB//Z";

try{

res.setContentType("image/*"); // 设置返回的文件类型

OutputStream toClient = res.getOutputStream();

GenerateImage(xmlImg,toClient);

}catch(Exception ex){

System.out.println(ex.toString());

}

}

// 对字节数组字符串进行Base64解码并生成图片

public static boolean GenerateImage(String imgStr,OutputStream out) {

if (imgStr == null) // 图像数据为空

return false;

BASE64Decoder decoder = new BASE64Decoder();

try {

// Base64解码

byte[] b = decoder.decodeBuffer(imgStr);

for (int i = 0; i < b.length; ++i) {

if (b[i] < 0) {// 调整异常数据

b[i] += 256;

}

}

//   OutputStream out = new FileOutputStream(imgFilePath);

out.write(b);

out.flush();

out.close();

return true;

} catch (Exception e) {

return false;

}

}

}

客户端代码

用servlet显示base64编码的图片

原博客为新浪博客作者“流星”。地址http://blog.sina.com.cn/s/blog_4ad7c2540100bemr.html  转载请注明出处及原作者。

java base64 转图片不现实_BASE64编码的图片在网页中的显示问题的解决相关推荐

  1. HTML的超级链接,HTML对图片的控制,表格(TABLE)标记,网页中的框架,会移动的文字(4)

    9 超级链接 普通超级链接1 超级链接是整个WWW应用的核心和基础.如果没有超级链接的概念,那么,我们现在所有的WWW的应用将不复存在.所以,对超级链接的掌握具有特殊重要的意义. 普通超级链接2 超级 ...

  2. BASE64编码的图片在网页中的显示问题

    BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='base64编码'/>的方式显示 Base64 在CSS中的使用 .demoIm ...

  3. Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中

    前面两篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站.如何配置Servlet简单实现表单提交,这篇文章主要讲述配置MySQL实现数据库连接MyEclipse,最后将查询表中的数据显 ...

  4. Hexo博客中插入图片,在网页中无法显示:采用图床外链的方法

    个人博客:小序的时光机,欢迎访问! 最近在用Hexo搭建博客过程中,发现如果在博文中添加本地图片,网页上的图片无法显示.网上的搜到的方法很多都是利用hexo-asset-image插件,然而该插件还是 ...

  5. java base64 转图片不现实_Base64.decodeBase64将base64转图片的问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public void addImg(String imgStr, String imgFilePath) { int d = imgStr.indexO ...

  6. 【转】各种媒体数据以 base64 编码方式直接嵌入网页中的写法

    png 图片: <img src="https://img-blog.csdnimg.cn/2022010610442955087.png"/> wav 文件: < ...

  7. 各种媒体数据以 base64 编码方式直接嵌入网页中的写法

    为什么80%的码农都做不了架构师?>>>    png 图片: &lt;img src=&quot;data:image/png;base64,iVBORw0KGgo ...

  8. html图片左侧现实文字,css 关于图片上显示文字

    图片上显示文字,现在有很多主流的方法,最常用的就是position设置为relative或者absolute. 本文带来了一种新的实现方式:采用height为0+overflow为visible的方式 ...

  9. Hbuilder插入图片网页中无法显示

    img文件夹也有图片,路径也没错,但是图片就是加载不出来,有没有大佬告知解决办法

最新文章

  1. nginx检查配置文件语法是否正常,需要检查主配置文件
  2. 服务器虚拟化北向,KVM虚拟化的部署及使用
  3. 【错误记录】Google Play 上架报错 ( APK 大小 | 目标 API 级别 | Google Play 帮助文档 )
  4. nginx工作进程处理请求的系统调用
  5. Backend cache is always enabled
  6. 单元测试Java Hadoop作业
  7. Flutter快速构建集美观与⾼性能于⼀体的APP
  8. 早起 - 对我影响最大的习惯
  9. matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
  10. 微软以白金会员加入 OpenChain 开源组织
  11. Oracle数据把持和控制言语详解-1
  12. 《数学分析新讲》_张筑生,12.5节:隐函数定理(1)
  13. Git 修改历史提交中的用户名和邮箱
  14. 高效搭建基于dnsmasq通过webui管理的dns服务器
  15. 基于毫米波雷达的手势识别原理
  16. 小常识:保险中的“保全”是什么?
  17. 保密单位 计算机维修保密协议,计算机维修保密协议.doc
  18. 【社媒营销】四大跨境营销渠道分析
  19. 2021爱智先行者—红外学习模块(空调遥控器)
  20. 求阶乘问题c语言编程,求阶乘问题

热门文章

  1. 测试LINUX常用命令全集
  2. 全国OSTA计算机高新技术SQLSever数据库四级证书--考证复习知识点集合(附下载地址)
  3. 数字化赋能,助推微电网高质量发展
  4. java版wifi下载电脑版_360wifi下载
  5. 【转载】如何用Python发送Email邮件?
  6. Spring框架技术总结(一),java编程自学教程
  7. 解构语音交互产品--VUI设计原则
  8. 只需20分钟,免费搭建你的个人网站!
  9. 关于华为云的域名认证问题
  10. 有苦有乐的算法 --- 一个int类型的数,换成二进制后,提取最右侧的1所在位置