当前位置: 首页 > Web前端 > HTML5

Android与H5交互体验(Base64图片)

时间:2023-04-05 21:04:23 HTML5

1.图片转Base64字符串;a、Android转Base64字符串:1)将本地文件转为Base64字符串;publicstaticStringfileToBase64(Stringpath){if(TextUtils.isEmpty(path)){返回空;}FileInputStreamfis=null;int字节大小=0;try{fis=newFileInputStream(路径);byteSize=fis.available();}catch(IOExceptione){e.printStackTrace();}intsize=byteSize/MB;位图位图=BitmapFactory.decodeStream(fis);if(size>5){//当图片大于5兆时,进行尺寸压缩(做一个压缩过程,转换Base64字符串会更快)bitmap=getScaleBitmap(bitmap);}字符串bitmapStr="";如果(位图!=null){try{ByteArrayOutputStreamoutputStream=newByteArrayOutputStream();if(size>5){//当图片大于5兆时,进行质量压缩intmultiple=size/5;bitmap.compress(Bitmap.CompressFormat.JPEG,100/multiple,outputStream);}else{bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);}bitmapStr=Base64.getEncoder().encodeToString(outputStream.toByteArray());}catch(RuntimeExceptione){e.printStackTrace();}}returnbitmapStr;}2)对位图做尺寸压缩publicstaticBitmapgetScaleBitmap(Bitmapbitmap){if(bitmap==null){returnnull;}//将大于1080px的图片转换为1080px尺寸,可根据业务修改finalintminSize=1080;intbitmapWidth=bitmap.getWidth();intbitmapHeight=bitmap.getHeight();int比例宽度;int比例高度;inttempSize=Math.min(bitmapWidth,bitmapHeight);floatscaleFactor=(float)minSize/(float)tempSize;//确定最大长度或宽度if(tempSize==bitmapWidth){if(tempSize>minSize){scaleWidth=minSize;scaleHeight=(int)(bitmapHeight*scaleFactor);}else{返回位图;}}else{if(tempSize>minSize){scaleHeight=minSize;scaleWidth=(int)(bitmapWidth*scaleFactor);}else{返回位图;}}位图scaleBitmap=Bitmap.createScaledBitmap(bitmap,scaleWidth,scaleHeight,true);返回比例位图;}压缩图片的目的是提高Base64字符串的转换速度,但如果对图片的像素有要求,则不会做压缩处理;H5不能直接使用转换后的Base64字符;H5加载Base64图片格式为:下面的(...)是我们传给H5的Base64字符串;所以还是我们加上前面的部分,传过去传给H5,或者H5自己拼接上一段;最好由H5处理,可以定义图片的类型;b、将H5传过来的Base64字符串转成图片保存到本地:1)H5传过来的字符串转成位图保存到本地;H5传给Android的Base64字符串格式为(data:image/png;base64,...),如果直接转成图片保存在本地,无法正常显示;这里,我们需要对传过来的字符进行处理,去掉前面的部分,只留下(...)省略号部分;publicstaticBitmapconvertStr2Bitmaph5(Stringstr){Bitmapbitmap=null;if(!TextUtils.isEmpty(str)){try{//将H5中的Base64字符传过来处理intindexOf=str.lastIndexOf(",");字符串子串=str.substring(indexOf+1);//getDecoder:可以解码+和/(2d);getUrlDecoder:可以解码-和_(5f)byte[]bytes=Base64.getDecoder().decode(substring);位图=BitmapFactory.decodeByteArray(字节,0,字节长度);}catch(RuntimeExceptione){e.printStackTrace();}}返回位图;}2)保存位图到本地publicstaticvoidsaveBitmapToFile(Bitmapbm,Bitmap.CompressFormatformat,Stringpath,StringfileName){if(null==bm){return;}FileOutputStreamfos=null;BufferedOutputStreambos=null;尝试{FiledirFile=newFile(path);如果(!dirFile.exists()){FileUtil.mkdirs(dirFile);}文件myCaptureFile=新文件(路径+文件名);如果(myCaptureFile.exists()){FileUtil.deleteAll(myCaptureFile);}fos=newFileInputStream(myCaptureFile);bos=newBufferedOutputStream(fos);bm.compress(格式,100,bos);bos.flush();}catch(IOExceptione){e.printStackTrace();}finally{if(bm!=null){bm.recycle();}if(bos!=null){try{bos.close();}catch(IOExceptione){e.printStackTrace();}}}}最后刷新本地相册就可以看到保存的图片了;