java中图片与base64位编码互转
java读取图片并转化为二进制字符串

java读取图⽚并转化为⼆进制字符串本例⼦的⽬的在于测试往oracle数据库中插⼊blob字段//以下代码源于:https://www.cnblogs.com/ywlx/p/4544179.htmlpublic static String getImgStr(String imgFile){ //将图⽚⽂件转化为字节数组字符串,并对其进⾏Base64编码处理
InputStream in = null; byte[] data = null; //读取图⽚字节数组 try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } return new String(Base64.encodeBase64(data)); }
--利⽤以上的思路写的⼀个测试public class ReadImageTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream(new File("C:\\Users\\luzhifei\\Pictures\\hc_logo.png")); String picStr=""; byte[] read = null; int len = 0; read= new byte[fis.available()]; fis.read(read);
String baseStr= Base64.getEncoder().encodeToString(read); //System.out.println( baseStr); byte[] op= Base64.getDecoder().decode(baseStr); // System.out.println(new String(op));
Java实现图片与二进制的互相转换

Java实现图⽚与⼆进制的互相转换本⽂实例为⼤家分享了Java将图⽚转⼆进制再将⼆进制转成图⽚,供⼤家参考,具体内容如下import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class TestImageBinary {static BASE64Encoder encoder = new sun.misc.BASE64Encoder();static BASE64Decoder decoder = new sun.misc.BASE64Decoder();public static void main(String[] args) {System.out.println(getImageBinary());base64StringToImage(getImageBinary());}static String getImageBinary(){File f = new File("c://20090709442.jpg");BufferedImage bi;try {bi = ImageIO.read(f);ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(bi, "jpg", baos);byte[] bytes = baos.toByteArray();return encoder.encodeBuffer(bytes).trim();} catch (IOException e) {e.printStackTrace();}return null;}static void base64StringToImage(String base64String){try {byte[] bytes1 = decoder.decodeBuffer(base64String);ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);BufferedImage bi1 =ImageIO.read(bais);File w2 = new File("c://QQ.bmp");//可以是jpg,png,gif格式ImageIO.write(bi1, "jpg", w2);//不管输出什么格式图⽚,此处不需改动} catch (IOException e) {e.printStackTrace();}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
javaBase64编码、解码

javaBase64编码、解码⽬录并⾮所有数据都可以⽤String类型来显⽰(例如字节流数据),但是都可以转为byte数组后进⾏base64编码再转String来显⽰,使⽤的时候再解码成原数据即可。
jdk8提供了Base64的⽀持、使⽤⾮常简单。
只需区分开encode与decode即可。
encode:编码,可以将任意数据进⾏base64编码//byte数组进⾏编码byte[] bytes = new byte[1024];byte[] encode = Base64.getEncoder().encode(bytes);decode:解码,⽤户将进⾏了base64编码的数据还原//编码结果进⾏Base64解码,解码得到的byte数组即为编码源数组byte[] encode = Base64.getDecoder().decode(encode);所有对象类型⽀持Base64编码解码。
java所有对象都是继承了Object的,请看以下代码。
可以确定java的所有对象类型皆可采⽤base64编码后传输,解码获取。
//Base64解码为String类型String str1 = new String(Base64.getDecoder().decode(encode2));System.out.println("原⽂原⽂⽂"+msg1);System.out.println("编码解码后"+str1);//获取 Long 类型Base64编码Object oldObject = new Long("12354687");ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(oldObject);//原对象字节数组byte[] bytes = outputStream.toByteArray();//编码后字节数组byte[] encode3 = Base64.getEncoder().encode(bytes);//解码后字节数组byte[] decode1 = Base64.getDecoder().decode(encode3);//此处可以通过循环判定内容是否变更,由于字节数组内容完全相等,所以”不想等“字符串永不打印if(bytes.length==decode1.length){for (int i = 0; i < decode1.length; i++) {if(bytes[i]!=decode1[i]){System.out.println("不相等");}}}ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decode1);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);Object newObject = objectInputStream.readObject();System.out.println("新旧对象是否相等:"+newObject.equals(oldObject));。
JavaScript实现Base64编码转换

JavaScript实现Base64编码转换简介Base64是⼀种基于64个可打印字符来表⽰⼆进制数据的表⽰⽅法。
由于2的6次⽅等于64,所以每6个⽐特为⼀个单元,对应某个可打印字符。
三个字节有24个⽐特,对应于4个Base64单元,即3个字节需要⽤4个可打印字符来表⽰。
它可⽤来作为电⼦邮件的传输编码。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外的两个可打印符号在不同的系统中⽽不同,⼀般为+和/。
转换原理Base64的直接数据源是⼆进制序列(Binary Sequence)。
当然,你也可以将图⽚、⽂本和⾳视频转换成⼆进制序列,再然后转换为Base64编码。
我们这⾥讨论的是如何将⼆进制转换为Base64编码,对于如何将图⽚,⽂本和⾳视频转换为⼆进制序列敬请期待。
在转换前,先定义⼀张索引表,这张表规定了如何转换:转换的时候我们先将⼆进制序列分组,每6个⽐特为⼀组。
但是如果编码的字节数不能被3整除,那么最后就会多出1个或两个字节,可以使⽤下⾯的⽅法进⾏处理:先使⽤0字节值在末尾补⾜,使其能够被3整除,然后再进⾏base64的编码。
在编码后的base64⽂本后加上⼀个或两个'='号,代表补⾜的字节数。
也就是说,当最后剩余⼀个⼋位字节(⼀个byte)时,最后⼀个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个⼋位字节(2个byte)时,最后⼀个6位的base字节块有两位是0值,最后附加⼀个等号。
参考下表:JavaScript实现Base64原理明⽩了以后,实现起来就很容易了。
define(function(require, exports, module) {var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); //索引表 /*** @author laixiangran@* @description 将⼆进制序列转换为Base64编码* @param {String}* @return {String}*/function binToBase64(bitString) {var result = "";var tail = bitString.length % 6;var bitStringTemp1 = bitString.substr(0, bitString.length - tail);var bitStringTemp2 = bitString.substr(bitString.length - tail, tail);for (var i = 0; i < bitStringTemp1.length; i += 6) {var index = parseInt(bitStringTemp1.substr(i, 6), 2);result += code[index];}bitStringTemp2 += new Array(7 - tail).join("0");if (tail) {result += code[parseInt(bitStringTemp2, 2)];result += new Array((6 - tail) / 2 + 1).join("=");}return result;}/*** @author laixiangran@* @description 将base64编码转换为⼆进制序列* @param {String}* @return {String}*/function base64ToBin(str) {var bitString = "";var tail = 0;for (var i = 0; i < str.length; i++) {if (str[i] != "=") {var decode = code.indexOf(str[i]).toString(2);bitString += (new Array(7 - decode.length)).join("0") + decode;} else {tail++;}}return bitString.substr(0, bitString.length - tail * 2);}/*** @author laixiangran@* @description 将字符转换为⼆进制序列* @param {String} str* @return {String}*/function stringToBin(str) {var result = "";for (var i = 0; i < str.length; i++) {var charCode = str.charCodeAt(i).toString(2);result += (new Array(9 - charCode.length).join("0") + charCode);}return result;}/*** @author laixiangran@* @description 将⼆进制序列转换为字符串* @param {String} Bin*/function BinToStr(Bin) {var result = "";for (var i = 0; i < Bin.length; i += 8) {result += String.fromCharCode(parseInt(Bin.substr(i, 8), 2));}return result;}exports.base64 = function(str) {return binToBase64(stringToBin(str));}exports.decodeBase64 = function(str) {return BinToStr(base64ToBin(str));}})将图⽚数据进⾏Base64编码将图⽚数据转换为Base64,⾸先要获取到图⽚的⼆进制数据。
Java实现Base64编解码

Java实现Base64编解码为什么要⽤Base64编码在⽹络中传输数据都是使⽤ascii⽅式传输。
对于⼀些图⽚、视频等数据,可能就会被编码成ascii中不可见部分的编码。
⽹络中不同的路由设备处理⽅式不同,有可能就会把这部分数据弄丢了。
为了保证数据传输的正确性,可以使⽤Base64编码将这些不可见数据编码成可见数据。
Java实现Base64编解码的⼏种⽅法⽅法⼀使⽤sun.misc包中的BASE64Encoder和BASE64Decoder类进⾏编解码。
这种⽅式⽐较古⽼,不推荐使⽤。
代码如下:/*** sun.misc⽅式Base64编码* @param str* @return*/public static String encodeBySunMisc(String str) {try {return new BASE64Encoder().encode(str.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();return "";}}/*** sun.misc⽅式Base64解码* @param str* @return*/public static String decodeBySunMisc(String str) {try {byte[] result = new BASE64Decoder().decodeBuffer(str);return new String(result);} catch (IOException e) {e.printStackTrace();return "";}}sun.misc的Base64⼯具虽然在jdk中,但是并不属于标准库,所以在Eclipse中⽆法直接使⽤。
可以通过⼿动引⼊⽅式使⽤。
使用Base64将字节数组编码成字符串,或者将字符串解码成字节数组

使⽤Base64将字节数组编码成字符串,或者将字符串解码成字节数组⼀、根据图⽚的url将图⽚读⼊字节输⼊流中,然后将字节输⼊流中的内容读取到字节数组中,再将字节数组通过Base64编码成字符串Map resultMap = new HashMap();List<String> images = new ArrayList<>();//根据采购订单详细获取样本图⽚,转为字节流List<AttachFile> fileList = attachFileService.getFileList(inDetailId, "B_IN_DETAIL", "BIDSAMPLE_IMG");fileList.stream().forEach(file -> {String url = shareFile + "/" + file.getUploadPath() + "/" + file.getCompressedName();try (InputStream in = new BufferedInputStream(new FileInputStream(url))) {byte[] srcBytes = new byte[in.available()];in.read(srcBytes);images.add(Base64.getEncoder().encodeToString(srcBytes));} catch (Exception e) {log.error("图⽚转换流异常:" + e.getMessage());}});resultMap.put("IMAGES", images);return resultMap;⼆、将JSON字符串转换成字节数组,然后将字节数组中的内容通过字节输出流写⼊⽂件中//将字符串转换为byte数组byte[] bytes = Base64.getDecoder().decode(base64.trim());File file = new File(dir + "/" + fileName);FileOutputStream fos = new FileOutputStream(file);BufferedOutputStream bos = new BufferedOutputStream(fos);bos.write(bytes);if (bos != null) {bos.close();}if (fos != null) {fos.close();}引⼊Base64:import java.util.Base64。
C#图片与Base64的相互转化

C#图⽚与Base64的相互转化 public ActionResult UploadSignature2(string src_data){Class1.Base64StrToImage(src_data, "C:\\Users\\45448\\Desktop\\1\\"+ DateTime.Now.ToString("yyyyMMddHHss") + ".png");return Json(1, JsonRequestBehavior.AllowGet);}///<summary>///将Base64字符串转换为图⽚并保存到本地///</summary>///<param name="base64Str">base64字符串</param>///<param name="savePath">图⽚保存地址,如:/Content/Images/10000.png</param>///<returns></returns>public static bool Base64StrToImage(string base64Str, string savePath){var ret = true;try{base64Str = base64Str.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", ""); //将base64头部信息替换var bitmap = Base64StrToImage(base64Str);if (bitmap != null){//创建⽂件夹var folderPath = savePath.Substring(0, stIndexOf('\\'));////FileHelper.CreateDir(folderPath);if (!Directory.Exists(folderPath)){Directory.CreateDirectory(folderPath);}//图⽚后缀格式var suffix = savePath.Substring(stIndexOf('.') + 1,savePath.Length - stIndexOf('.') - 1).ToLower();var suffixName = suffix == "png"? ImageFormat.Png: suffix == "jpg" || suffix == "jpeg"? ImageFormat.Jpeg: suffix == "bmp"? ImageFormat.Bmp: suffix == "gif"? ImageFormat.Gif: ImageFormat.Jpeg;//这⾥复制⼀份对图像进⾏保存,否则会出现“GDI+ 中发⽣⼀般性错误”的错误提⽰var bmpNew = new Bitmap(bitmap);bmpNew.Save(savePath, suffixName);bmpNew.Dispose();bitmap.Dispose();}else{ret = false;}}catch (Exception ex){ret = false;}return ret;}///<summary>/// Image 转成 base64///</summary>///<param name="fileFullName"></param>public static string ImageToBase64(string fileFullName){try{Bitmap bmp = new Bitmap(fileFullName);MemoryStream ms = new MemoryStream();var suffix = fileFullName.Substring(stIndexOf('.') + 1, fileFullName.Length - stIndexOf('.') - 1).ToLower();var suffixName = suffix == "png"? ImageFormat.Png: suffix == "jpg" || suffix == "jpeg"? ImageFormat.Jpeg: suffix == "bmp"? ImageFormat.Bmp: suffix == "gif"? ImageFormat.Gif: ImageFormat.Jpeg;bmp.Save(ms, suffixName);byte[] arr = new byte[ms.Length]; ms.Position = 0;ms.Read(arr, 0, (int)ms.Length); ms.Close();return Convert.ToBase64String(arr);}catch (Exception ex){return null;}}。
base64字符串还原成原图片

base64字符串还原成原图⽚今天做⼀个截图上传到ftp服务器的功能,⽤的是jquery插件cropbox.js,后台使⽤的springmvc@RequestMapping("/saveProductInfo")public ModelAndView uploadPreviewImage(HttpServletRequest request,AbcTourProduct product,ScheduleVO scheduleVO) throws IOException{ ModelAndView modelAndView=new ModelAndView(); //1.⽂件上传 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request; MultipartFile smallMutiFile = multipartRequest.getFile("upload-file"); MultipartFile bigMutiFile = multipartRequest.getFile("upload-file2"); String fileName1= smallMutiFile.getOriginalFilename(); String fileName2= bigMutiFile.getOriginalFilename(); int i1=stIndexOf("."); String name1=fileName1.substring(0, i1); String suffix1=fileName1.substring(i1); String smallName=name1+UUID.randomUUID().toString()+suffix1; int i2=stIndexOf("."); String name2=fileName2.substring(0, i2); String suffix2=fileName2.substring(i2); String bigName=name2+UUID.randomUUID().toString()+suffix2; File smallFile=FileUtil.multipartFileToFile(smallMutiFile); File bigFile=FileUtil.multipartFileToFile(bigMutiFile); boolean success1=FileUtil.ftpUpload(smallFile, smallName, "/journey/product/"); boolean success2=FileUtil.ftpUpload(bigFile, bigName, "/journey/product/"); if(success1&&success2){ String smallSrc="/journey/product/"+ smallName; String bigSrc="/journey/product/"+ bigName; product.setProImgUrl(bigSrc); product.setProSmallImgUrl(smallSrc); //新增产品 List<AbcSchedule>scheduleList =scheduleVO.getScheduleVOs(); productService.insertSelective(product, scheduleList); } return modelAndView;}这样做了之后,controller中获得的是原图⽽不是截图,于是我去看插件的实现,发现截图后的图⽚的src是base64的⼀串字符串,⾮常长,如下图只是⼀⼩部分:然后我就想着怎样把这⼀串的字符串在后台转成图⽚进⾏上传,做了⼀个⼩栗⼦:package com.admin.controller;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import .util.Base64;import org.springframework.stereotype.Controller;import org.springframework.util.FileCopyUtils;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.MultipartHttpServletRequest;import org.springframework.web.servlet.ModelAndView;@RequestMapping("/saveProductInfo")public void uploadPreviewImage(String base64Str) throws IOException{ int start = base64Str.indexOf(',') + 1; base64Str=base64Str.substring(start);//注意:需要将头部的给去掉 byte[] bytes=Base64.decodeBase64(base64Str); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) {// 调整异常数据 bytes[i] += 256; } } OutputStream outputStream=new FileOutputStream("d://aaa"); outputStream.write(bytes); outputStream.flush(); outputStream.close();}对,就是这样,然后再⽤File取这个图⽚,在进⾏上传的相关步骤注意引⼊的Base64的包,maven坐标是这个<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.7</version></dependency>话说,这个东西花费了我⼤半天的功夫,,,主要原因是在截取去掉base64字符串的头部的的时候多算了⼀位导致⽣成的图⽚⼀直是损坏⽆法打开的,特此,mark⼀下=====================================================================================================在出问题的时候在技术群问了,有两点启发1.通过base64字符串不能获得原图⽚的后缀,所以巧妙的⽅法是不写后缀,因为图⽚都是在web端查看的,所以不写后缀的话会选择合适的形式来打开2.另外⼀哥们⼉写过的代码,还没仔细看,先存档⼀下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
public static boolean GenerateImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
JAVA CODE
impoava.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Test64Bit {
public static void main(String[] args) {
// 测试从Base64编码转换为图片文件
String strImg = "这里放64位编码";
if (bytes[i] < 0) {// 调整异常数据
bytes[i] += 256;
}
}
// 生成jpeg图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(bytes);
out.flush();
out.close();
GenerateImage(strImg, "D:\wangyc.jpg");
// 测试从图片文件转换为Base64编码
System.out.println(GetImageStr("d:\wangyc.jpg"));
}
public static String GetImageStr(String imgFilePath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
return true;
} catch (Exception e) {
return false;
}
}
}
JS
<img src="data:image/jpeg;base64,/9j/4QqsRX..." alt="">
if (imgStr == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解码
byte[] bytes = decoder.decodeBuffer(imgStr);
for (int i = 0; i < bytes.length; ++i) {
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgFilePath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {