1. 程式人生 > 程式設計 >java 壓縮圖片(只縮小體積,不更改圖片尺寸)的示例

java 壓縮圖片(只縮小體積,不更改圖片尺寸)的示例

1.情景展示

  在呼叫騰訊身份證OCR介面的時候,由於要求圖片大小隻能限制在1MB以內,這樣,就必須使用到圖片壓縮技術

2.程式碼展示

/**
* 圖片處理工具類
* @explain
* @author Marydon
* @creationTime 2019年9月3日上午10:14:17
* @version 1.0
* @since
* @email [email protected]
*/
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;

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.增加前端程式碼

/**
* 拍照或選擇圖片
*/
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 壓縮圖片的資料請關注我們其它相關文章!