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压缩图片的资料请关注毛票票其它相关文章!