java 压缩图片(只缩小体积,不更改图片尺寸)的示例
1.情景展示
在调用腾讯身份证OCR接口的时候,由于要求图片大小只能限制在1MB以内,这样,就必须使用到图片压缩技术
2.代码展示
/** *图片处理工具类 *@explain *@authorMarydon *@creationTime2019年9月3日上午10:14:17 *@version1.0 *@since *@emailmarydon20170307@163.com */ publicclassImgUtils{ /** *压缩图片(通过降低图片质量) *@explain压缩图片,通过压缩图片质量,保持原图大小 *@paramquality * 图片质量(0-1) *@returnbyte[] * 压缩后的图片(jpg) *@throws */ publicstaticbyte[]compressPicByQuality(byte[]imgByte,floatquality){ byte[]imgBytes=null; try{ ByteArrayInputStreambyteInput=newByteArrayInputStream(imgByte); BufferedImageimage=ImageIO.read(byteInput); //如果图片空,返回空 if(image==null){ returnnull; } //得到指定Format图片的writer(迭代器) Iteratoriter=ImageIO.getImageWritersByFormatName("jpeg"); //得到writer ImageWriterwriter=(ImageWriter)iter.next(); //得到指定writer的输出参数设置(ImageWriteParam) ImageWriteParamiwp=writer.getDefaultWriteParam(); //设置可否压缩 iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); //设置压缩质量参数 iwp.setCompressionQuality(quality); iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED); ColorModelcolorModel=ColorModel.getRGBdefault(); //指定压缩时使用的色彩模式 iwp.setDestinationType( newjavax.imageio.ImageTypeSpecifier(colorModel,colorModel.createCompatibleSampleModel(16,16))); //开始打包图片,写入byte[] //取得内存输出流 ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream(); IIOImageiIamge=newIIOImage(image,null,null); //此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput //通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream)); writer.write(null,iIamge,iwp); imgBytes=byteArrayOutputStream.toByteArray(); }catch(IOExceptione){ System.out.println("writeerrro"); e.printStackTrace(); } returnimgBytes; } }
3.其它代码
importorg.apache.commons.codec.binary.Base64;
StringimgBase64=""; try{ //图片大小超过1MB if(file.getSize()/1024>1024){ byte[]imgBytes=ImgUtils.compressPicByQuality(file.getBytes(),0.1F); imgBase64=Base64.encodeBase64String(imgBytes); }else{ imgBase64=Base64.encodeBase64String(file.getBytes()); } }catch(IOExceptione1){ e1.printStackTrace(); }
说明:
生成的base64图片没有图片格式头,即:data:image/jpeg;base64,
4.增加前端代码
/** *拍照或选择图片 */ this.uploadPicture=function(){ //js获取文件对象 varfileObj=document.getElementById("file").files[0]; if(null==fileObj){ alert("图像上传失败,请重试!"); } //TODO显示遮罩 //创建form表单 varformFile=newFormData(); //加入文件对象 formFile.append("file",fileObj); //创建XMLHttpRequest对象 varxhr=newXMLHttpRequest(); xhr.open("post",baseUrl+"/weixin/facein/upImg3.do",true); xhr.onload=function(){ varresData=JSON.parse(this.responseText) //将返回数据转换成JSON对象 varjson=eval('('+resData.data2+')'); //身份证识别成功 if(json.ret==0){ //TODO将所需数据填充到页面 }else{ alert("识别失败,请重试!"+json.msg); } document.getElementById("file").value=""; //TODO隐藏遮罩 }; //调用腾讯接口 xhr.send(formFile); };
以上就是java压缩图片(只缩小体积,不更改图片尺寸)的示例的详细内容,更多关于java压缩图片的资料请关注毛票票其它相关文章!