Java图片与二进制相互转换怎么实现


这篇文章主要介绍了Java图片与二进制相互转换怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java图片与二进制相互转换怎么实现文章都会有所收获,下面我们一起来看看吧。

1、下面是一个完整的代码示例

  • 指定文件路径转为二进制

  • 将网络图片转为二进制

  • base64 转为图片资源

package&nbsp.xxx.example.file;importjava.awt.image.BufferedImage;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;importjava.net.HttpURLConnection;importjava.net.URL;importjavax.imageio.ImageIO;import&nbsp.zxtc.syonline.supportmon.StringUtil;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;publicclassImageBioChangeUtil{staticBASE64Encoderencoder=newsun.misc.BASE64Encoder();staticBASE64Decoderdecoder=newsun.misc.BASE64Decoder();//从文件路径中获取图片转为二进制publicstaticStringgetImageBinary(StringfilePath){if(StringUtil.isEmpty(filePath)){returnnull;}Filef=newFile(filePath);//这里gif动态图不可以,虽然在后面也能输出gif格式,但是却不是动图BufferedImagebi;try{bi=ImageIO.read(f);ByteArrayOutputStreambaos=newByteArrayOutputStream();ImageIO.write(bi,"jpg",baos);byte[]bytes=baos.toByteArray();returnencoder.encodeBuffer(bytes).trim();}catch(IOExceptione){e.printStackTrace();}returnnull;}//从URl中获取图片转为二进制publicstaticStringgetImageBinaryFromUrl(StringurlPath)throwsException{if(StringUtil.isEmpty(urlPath)){return"";}URLurl=newURL(urlPath);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(3000);//超时提示1秒=1000毫秒InputStreaminStream=conn.getInputStream();//获取输出流byte[]data=readInputStream(inStream);returnencoder.encodeBuffer(data).trim();}//readInputStream方法privatestaticbyte[]readInputStream(InputStreaminStream)throwsException{ByteArrayOutputStreamoutStream=newByteArrayOutputStream();byte[]buffer=newbyte[1024];//转换为二进制intlen=0;while((len=inStream.read(buffer))!=-1){outStream.write(buffer,0,len);}returnoutStream.toByteArray();}//将二进制转为图片publicstaticvoidbase64StringToImage(Stringbase64String,StringoutFilePath){if(StringUtil.isNotEmpty(base64String)&&StringUtil.isNotEmpty(outFilePath)){try{byte[]bytes1=decoder.decodeBuffer(base64String);ByteArrayInputStreambais=newByteArrayInputStream(bytes1);BufferedImagebi1=ImageIO.read(bais);Filew2=newFile(outFilePath);//可以是jpg,png格式if(!w2.exists()){//文件不存在则创建文件,先创建目录Filedir=newFile(w2.getParent());dir.mkdirs();w2.createNewFile();//创建新文件}ImageIO.write(bi1,"jpg",w2);//不管输出什么格式图片,此处不需改动}catch(IOExceptione){e.printStackTrace();}}}publicstaticvoidmain(String[]args){StringimageBinary=null;try{imageBinary=getImageBinaryFromUrl("");}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println(imageBinary);StringoutFilePath="E://test//bio//zhh/aa.png";base64StringToImage(imageBinary,outFilePath);}}

2、如何判断 base64 图片的格式

//判断图片base64字符串的文件格式publicstaticStringcheckImageBase64Format(Stringbase64ImgData){byte[]b=Base64Util.decode(base64ImgData);Stringtype="";if(0x424D==((b[0]&0xff)<<8|(b[1]&0xff))){type="bmp";}elseif(0x8950==((b[0]&0xff)<<8|(b[1]&0xff))){type="png";}elseif(0xFFD8==((b[0]&0xff)<<8|(b[1]&0xff))){type="jpg";}returntype;}

3、将网络图片转为 base64 字符串

/***将网络路径图片转为base64的格式*@paramrequestUrl请求网络路径*@throwsException*/publicstaticStringgetUrlImageToBase64(StringrequestUrl)throwsException{ByteArrayOutputStreamdata=newByteArrayOutputStream();try{//创建URLURLurl=newURL(requestUrl);byte[]by=newbyte[1024];//创建链接HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5*1000);InputStreamis=conn.getInputStream();//将内容读取内存中intlen=-1;while((len=is.read(by))!=-1){data.write(by,0,len);}//关闭流is.close();}catch(IOExceptione){e.printStackTrace();}//对字节数组Base64编码Base64.Encoderencoder=Base64.getEncoder();//return"data:image/"+photoType+";base64,"+encoder.encodeToString(data.toByteArray());returnencoder.encodeToString(data.toByteArray());}

4、将 base64 字符串转为图片输出

/***将Base64编码的字符串转为文件输出*@parambase64String字符串*@parampath输出文件保存路径*@paramfileName输出文件名称*@return是否转换成功*/publicstaticbooleanwriteFileFromBase64(Stringbase64String,Stringpath,StringfileName){if(base64String==null){returnfalse;}try{byte[]b=Base64Util.decode(base64String);Filefile=newFile(path);if(!file.exists()){makeDir(file);}OutputStreamout=newFileOutputStream(path+fileName);out.write(b);out.flush();out.close();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}

注:该方法的入参,base64 格式文件不得有 文件头部标识信息,否则会转换失败。所以这里我们需要自行判断是否包含有头部信息。

StringurlImageToBase64="";//这里就是我们图片的base64字符串if(urlImageToBase64.indexOf(",")>-1){//包含头信息System.out.println("包含头部信息");urlImageToBase64=urlImageToBase64.substring(urlImageToBase64.indexOf(",")+1);}

5、将文件转为 base64 字符串

/***读入文件转换为Base64编码并返回*@paramfilePath文件路径*@returnbase64的文件*@throwsException*/publicstaticStringreadAsBase64FromFile(StringfilePath){InputStreamin=null;byte[]data=null;try{in=newFileInputStream(fileName);data=newbyte[in.available()];in.read(data);in.close();}catch(Exceptione){e.printStackTrace();returnnull;}returnBase64Util.encode(data);}

上面用到了一个 Base64Util.java

package&nbsp.xxx.example.util;publicfinalclassBase64Util{staticprivatefinalintBASELENGTH=128;staticprivatefinalintLOOKUPLENGTH=64;staticprivatefinalintTWENTYFOURBITGROUP=24;staticprivatefinalintEIGHTBIT=8;staticprivatefinalintSIXTEENBIT=16;staticprivatefinalintFOURBYTE=4;staticprivatefinalintSIGN=-128;staticprivatefinalcharPAD='=';staticprivatefinalbooleanfDebug=false;staticfinalprivatebyte[]base64Alphabet=newbyte[BASELENGTH];staticfinalprivatechar[]lookUpBase64Alphabet=newchar[LOOKUPLENGTH];static{for(inti=0;i<BASELENGTH;++i){base64Alphabet[i]=-1;}for(inti='Z';i>='A';i--){base64Alphabet[i]=(byte)(i-'A');}for(inti='z';i>='a';i--){base64Alphabet[i]=(byte)(i-'a'+26);}for(inti='9';i>='0';i--){base64Alphabet[i]=(byte)(i-'0'+52);}base64Alphabet['+']=62;base64Alphabet['/']=63;for(inti=0;i<=25;i++){lookUpBase64Alphabet[i]=(char)('A'+i);}for(inti=26,j=0;i<=51;i++,j++){lookUpBase64Alphabet[i]=(char)('a'+j);}for(inti=52,j=0;i<=61;i++,j++){lookUpBase64Alphabet[i]=(char)('0'+j);}lookUpBase64Alphabet[62]=(char)'+';lookUpBase64Alphabet[63]=(char)'/';}privatestaticbooleanisWhiteSpace(charoctect){return(octect==0x20||octect==0xd||octect==0xa||octect==0x9);}privatestaticbooleanisPad(charoctect){return(octect==PAD);}privatestaticbooleanisData(charoctect){return(octect<BASELENGTH&&base64Alphabet[octect]!=-1);}/***EncodeshexoctectsintoBase64**@parambinaryData*ArraycontainingbinaryData*@returnEncodedBase64array*/publicstaticStringencode(byte[]binaryData){if(binaryData==null){returnnull;}intlengthDataBits=binaryData.length*EIGHTBIT;if(lengthDataBits==0){return"";}intfewerThan24bits=lengthDataBits%TWENTYFOURBITGROUP;intnumberTriplets=lengthDataBits/TWENTYFOURBITGROUP;intnumberQuartet=fewerThan24bits!=0?numberTriplets+1:numberTriplets;charencodedData[]=null;encodedData=newchar[numberQuartet*4];bytek=0,l=0,b1=0,b2=0,b3=0;intencodedIndex=0;intdataIndex=0;if(fDebug){System.out.println("numberoftriplets="+numberTriplets);}for(inti=0;i<numberTriplets;i++){b1=binaryData[dataIndex++];b2=binaryData[dataIndex++];b3=binaryData[dataIndex++];if(fDebug){System.out.println("b1="+b1+",b2="+b2+",b3="+b3);}l=(byte)(b2&0x0f);k=(byte)(b1&0x03);byteval1=((b1&SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);byteval2=((b2&SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);byteval3=((b3&SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc);if(fDebug){System.out.println("val2="+val2);System.out.println("k4="+(k<<4));System.out.println("vak="+(val2|(k<<4)));}encodedData[encodedIndex++]=lookUpBase64Alphabet[val1];encodedData[encodedIndex++]=lookUpBase64Alphabet[val2|(k<<4)];encodedData[encodedIndex++]=lookUpBase64Alphabet[(l<<2)|val3];encodedData[encodedIndex++]=lookUpBase64Alphabet[b3&0x3f];}//formintegralnumberof6-bitgroupsif(fewerThan24bits==EIGHTBIT){b1=binaryData[dataIndex];k=(byte)(b1&0x03);if(fDebug){System.out.println("b1="+b1);System.out.println("b1<<2="+(b1>>2));}byteval1=((b1&SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);encodedData[encodedIndex++]=lookUpBase64Alphabet[val1];encodedData[encodedIndex++]=lookUpBase64Alphabet[k<<4];encodedData[encodedIndex++]=PAD;encodedData[encodedIndex++]=PAD;}elseif(fewerThan24bits==SIXTEENBIT){b1=binaryData[dataIndex];b2=binaryData[dataIndex+1];l=(byte)(b2&0x0f);k=(byte)(b1&0x03);byteval1=((b1&SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);byteval2=((b2&SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);encodedData[encodedIndex++]=lookUpBase64Alphabet[val1];encodedData[encodedIndex++]=lookUpBase64Alphabet[val2|(k<<4)];encodedData[encodedIndex++]=lookUpBase64Alphabet[l<<2];encodedData[encodedIndex++]=PAD;}returnnewString(encodedData);}/***DecodesBase64dataintooctects**@paramencoded*stringcontainingBase64data*@returnArraycontaininddecodeddata.*/publicstaticbyte[]decode(Stringencoded){if(encoded==null){returnnull;}char[]base64Data=encoded.toCharArray();//removewhitespacesintlen=removeWhiteSpace(base64Data);if(len%FOURBYTE!=0){returnnull;//shouldbedivisiblebyfour}intnumberQuadruple=(len/FOURBYTE);if(numberQuadruple==0){returnnewbyte[0];}bytedecodedData[]=null;byteb1=0,b2=0,b3=0,b4=0;chard1=0,d2=0,d3=0,d4=0;inti=0;intencodedIndex=0;intdataIndex=0;decodedData=newbyte[(numberQuadruple)*3];for(;i<numberQuadruple-1;i++){if(!isData((d1=base64Data[dataIndex++]))||!isData((d2=base64Data[dataIndex++]))||!isData((d3=base64Data[dataIndex++]))||!isData((d4=base64Data[dataIndex++]))){returnnull;}//iffound"nodata"justreturnnullb1=base64Alphabet[d1];b2=base64Alphabet[d2];b3=base64Alphabet[d3];b4=base64Alphabet[d4];decodedData[encodedIndex++]=(byte)(b1<<2|b2>>4);decodedData[encodedIndex++]=(byte)(((b2&0xf)<<4)|((b3>>2)&0xf));decodedData[encodedIndex++]=(byte)(b3<<6|b4);}if(!isData((d1=base64Data[dataIndex++]))||!isData((d2=base64Data[dataIndex++]))){returnnull;//iffound"nodata"justreturnnull}b1=base64Alphabet[d1];b2=base64Alphabet[d2];d3=base64Data[dataIndex++];d4=base64Data[dataIndex++];if(!isData((d3))||!isData((d4))){//CheckiftheyarePADcharactersif(isPad(d3)&&isPad(d4)){if((b2&0xf)!=0)//last4bitsshouldbezero{returnnull;}byte[]tmp=newbyte[i*3+1];System.arraycopy(decodedData,0,tmp,0,i*3);tmp[encodedIndex]=(byte)(b1<<2|b2>>4);returntmp;}elseif(!isPad(d3)&&isPad(d4)){b3=base64Alphabet[d3];if((b3&0x3)!=0)//last2bitsshouldbezero{returnnull;}byte[]tmp=newbyte[i*3+2];System.arraycopy(decodedData,0,tmp,0,i*3);tmp[encodedIndex++]=(byte)(b1<<2|b2>>4);tmp[encodedIndex]=(byte)(((b2&0xf)<<4)|((b3>>2)&0xf));returntmp;}else{returnnull;}}else{//NoPADe.g3cQlb3=base64Alphabet[d3];b4=base64Alphabet[d4];decodedData[encodedIndex++]=(byte)(b1<<2|b2>>4);decodedData[encodedIndex++]=(byte)(((b2&0xf)<<4)|((b3>>2)&0xf));decodedData[encodedIndex++]=(byte)(b3<<6|b4);}returndecodedData;}/***removeWhiteSpacefromMIMEcontainingencodedBase64data.**@paramdata*thebytearrayofbase64data(withWS)*@returnthenewlength*/privatestaticintremoveWhiteSpace(char[]data){if(data==null){return0;}//countcharactersthat'snotwhitespaceintnewSize=0;intlen=data.length;for(inti=0;i<len;i++){if(!isWhiteSpace(data[i])){data[newSize++]=data[i];}}returnnewSize;}}

关于“Java图片与二进制相互转换怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java图片与二进制相互转换怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注主机评测网行业资讯频道。


上一篇:GoLang?OS包及File类型源码分析

下一篇:JavaScript如何实现异步任务循环顺序执行


Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器