1.情景展示
在调用腾讯身份证OCR接口的时候,由于要求图片大小只能限制在1MB以内,这样,就必须使用到图片压缩技术
2.代码展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/**
* 图片处理工具类
* @explain
* @author Marydon
* @creationTime 2019年9月3日上午10:14:17
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class ImgUtils {
/**
* 压缩图片(通过降低图片质量)
* @explain 压缩图片,通过压缩图片质量,保持原图大小
* @param quality
* 图片质量(0-1)
* @return byte[]
* 压缩后的图片(jpg)
* @throws
*/
public static byte [] compressPicByQuality( byte [] imgByte, float quality) {
byte [] imgBytes = null ;
try {
ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
BufferedImage image = ImageIO.read(byteInput);
// 如果图片空,返回空
if (image == null ) {
return null ;
}
// 得到指定Format图片的writer(迭代器)
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName( "jpeg" );
// 得到writer
ImageWriter writer = (ImageWriter) iter.next();
// 得到指定writer的输出参数设置(ImageWriteParam )
ImageWriteParam iwp = writer.getDefaultWriteParam();
// 设置可否压缩
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 设置压缩质量参数
iwp.setCompressionQuality(quality);
iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
ColorModel colorModel = ColorModel.getRGBdefault();
// 指定压缩时使用的色彩模式
iwp.setDestinationType(
new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel( 16 , 16 )));
// 开始打包图片,写入byte[]
// 取得内存输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IIOImage iIamge = new IIOImage(image, null , null );
// 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
// 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
writer.write( null , iIamge, iwp);
imgBytes = byteArrayOutputStream.toByteArray();
} catch (IOException e) {
System.out.println( "write errro" );
e.printStackTrace();
}
return imgBytes;
}
}
|
3.其它代码
import org.apache.commons.codec.binary.Base64;
1
2
3
4
5
6
7
8
9
10
11
12
|
String imgBase64 = "" ;
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 (IOException e1) {
e1.printStackTrace();
}
|
说明:
生成的base64图片没有图片格式头,即:data:image/jpeg;base64,
4.增加前端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/**
* 拍照或选择图片
*/
this .uploadPicture = function () {
// js 获取文件对象
var fileObj = document.getElementById( "file" ).files[0];
if ( null == fileObj) {
alert( "图像上传失败,请重试!" );
}
// TODO 显示遮罩
// 创建form表单
var formFile = new FormData();
//加入文件对象
formFile.append( "file" , fileObj);
// 创建XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
xhr.open( "post" , baseUrl + "/weixin/facein/upImg3.do" , true );
xhr.onload = function () {
var resData = JSON.parse( this .responseText)
// 将返回数据转换成JSON对象
var json = eval( '(' + resData.data2 + ')' );
// 身份证识别成功
if (json.ret == 0) {
// TODO 将所需数据填充到页面
} else {
alert( "识别失败,请重试!" + json.msg);
}
document.getElementById( "file" ).value = "" ;
// TODO 隐藏遮罩
};
// 调用腾讯接口
xhr.send(formFile);
};
|
以上就是java 压缩图片(只缩小体积,不更改图片尺寸)的示例的详细内容,更多关于java 压缩图片的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/Marydon20170307/p/11486776.html