197 lines
5.5 KiB
Java
197 lines
5.5 KiB
Java
|
/*
|
||
|
*
|
||
|
* Copyright (c) 2001-2018 泛微软件.
|
||
|
* 泛微协同商务系统,版权所有.
|
||
|
*
|
||
|
*/
|
||
|
package weaver.fna.invoice.utils;
|
||
|
|
||
|
import java.io.ByteArrayInputStream;
|
||
|
import java.io.ByteArrayOutputStream;
|
||
|
|
||
|
import com.weaver.general.Util;
|
||
|
import net.coobird.thumbnailator.Thumbnails;
|
||
|
import weaver.fna.invoice.Constants;
|
||
|
import weaver.fna.invoice.common.FnaInvoiceCommon;
|
||
|
import weaver.general.BaseBean;
|
||
|
|
||
|
import org.apache.commons.codec.binary.Base64;
|
||
|
import weaver.hrm.User;
|
||
|
|
||
|
/**
|
||
|
* @author zhangwj
|
||
|
* @Jan 23, 2019
|
||
|
*/
|
||
|
public class ImageUtil {
|
||
|
|
||
|
/**
|
||
|
* 图片转换
|
||
|
* @param fileData
|
||
|
* @return
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static byte[] transformImage(String fileData) throws Exception{
|
||
|
imageCheck(fileData);
|
||
|
BaseBean bb = new BaseBean();
|
||
|
byte[] imageByte = Base64.decodeBase64(fileData);
|
||
|
long fileLen = imageByte.length;
|
||
|
//大于2.5M,进行压缩
|
||
|
if (fileLen > Constants.MAX_BYTES) {
|
||
|
bb.writeLog("图片当前大小" + fileLen + ",需要压缩...");
|
||
|
imageByte = compressImage(imageByte);
|
||
|
}else{
|
||
|
bb.writeLog("图片当前大小" + fileLen + ",不需要压缩...");
|
||
|
}
|
||
|
if (imageByte.length == 0) {
|
||
|
throw new Exception("图片出现问题,请联系系统管理员!");
|
||
|
}
|
||
|
/*ByteArrayInputStream byteArrayInputStream = null;
|
||
|
ByteArrayOutputStream byteArrayOutputStream = null;
|
||
|
try {
|
||
|
byteArrayInputStream = new ByteArrayInputStream(imageByte);
|
||
|
byteArrayOutputStream = new ByteArrayOutputStream();
|
||
|
Thumbnails.of(byteArrayInputStream).useExifOrientation(false).scale(1).outputQuality(1d).toOutputStream(byteArrayOutputStream);
|
||
|
String base64 = readImageBase64(byteArrayOutputStream);
|
||
|
imageByte = Base64.decodeBase64(base64.replace("data:image/jpeg;base64,", ""));
|
||
|
} catch (Exception e) {
|
||
|
}finally{
|
||
|
try {
|
||
|
if(byteArrayOutputStream!=null){
|
||
|
byteArrayOutputStream.close();
|
||
|
}
|
||
|
} catch (Exception e0) {}
|
||
|
try {
|
||
|
if(byteArrayInputStream!=null){
|
||
|
byteArrayInputStream.close();
|
||
|
}
|
||
|
} catch (Exception e0) {}
|
||
|
}*/
|
||
|
return imageByte;
|
||
|
}
|
||
|
|
||
|
private static void imageCheck(String fileData) throws Exception{
|
||
|
if ("".equals(fileData)) {
|
||
|
throw new Exception("请选择正确的图片文件!");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 图片压缩
|
||
|
* @param imageBytes
|
||
|
* @return
|
||
|
*/
|
||
|
private static byte[] compressImage(byte[] imageBytes){
|
||
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
|
||
|
ByteArrayOutputStream byteArrayOutputStream = null;
|
||
|
BaseBean bb = new BaseBean();
|
||
|
try {
|
||
|
int count = 5;
|
||
|
double quality = 1d;
|
||
|
while(quality > 0){
|
||
|
quality = quality - 0.2d;
|
||
|
byteArrayInputStream = new ByteArrayInputStream(imageBytes);
|
||
|
byteArrayOutputStream = new ByteArrayOutputStream();
|
||
|
//压缩图片
|
||
|
Thumbnails.of(byteArrayInputStream).scale(quality).outputQuality(quality).toOutputStream(byteArrayOutputStream);
|
||
|
if(byteArrayOutputStream.toByteArray().length <= Constants.MAX_BYTES){
|
||
|
break;
|
||
|
}
|
||
|
count--;
|
||
|
if(count == 0) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
bb.writeLog("压缩质量:",quality);
|
||
|
} catch (Exception e) {
|
||
|
new BaseBean().writeLog("压缩出现错误:", e.getMessage());
|
||
|
} finally {
|
||
|
try {
|
||
|
if(byteArrayOutputStream!=null) {
|
||
|
byteArrayOutputStream.close();
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
bb.writeLog("出现错误:", e.getMessage());
|
||
|
}
|
||
|
try {
|
||
|
if(byteArrayInputStream!=null) {
|
||
|
byteArrayInputStream.close();
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
bb.writeLog("出现错误:", e.getMessage());
|
||
|
}
|
||
|
}
|
||
|
return byteArrayOutputStream.toByteArray();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 图片截取
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param w
|
||
|
* @param h
|
||
|
* @param imageBytes
|
||
|
* @return
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static String cutImg(int x,int y,int w,int h,byte[] imageBytes,String orientation) throws Exception {
|
||
|
ByteArrayInputStream byteArrayInputStream = null;
|
||
|
ByteArrayOutputStream byteArrayOutputStream = null;
|
||
|
try {
|
||
|
byteArrayOutputStream = new ByteArrayOutputStream();
|
||
|
byteArrayInputStream = new ByteArrayInputStream(imageBytes);
|
||
|
Thumbnails.of(byteArrayInputStream).sourceRegion(x, y, w, h).size(w, h).rotate(Util.getDoubleValue(orientation,0.00)).toOutputStream(byteArrayOutputStream);
|
||
|
} catch (Exception e) {
|
||
|
throw e;
|
||
|
} finally {
|
||
|
try {
|
||
|
if(byteArrayOutputStream!=null) {
|
||
|
byteArrayOutputStream.close();
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
try {
|
||
|
if(byteArrayInputStream!=null) {
|
||
|
byteArrayInputStream.close();
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
String base64 = readImageBase64(byteArrayOutputStream);
|
||
|
return base64;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 图片存储
|
||
|
* @param base64
|
||
|
* @return
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static int saveImage(String base64, User user) throws Exception{
|
||
|
base64 = base64.replaceFirst("data:image/jpeg;base64,", "");
|
||
|
byte[] imageByte = Base64.decodeBase64(base64);
|
||
|
int imageid = FnaInvoiceCommon.saveImage(imageByte,user);
|
||
|
return imageid;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取图片base64
|
||
|
* @param byteArrayOutputStream
|
||
|
* @return
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
private static String readImageBase64(ByteArrayOutputStream byteArrayOutputStream) throws Exception{
|
||
|
String base64 = "";
|
||
|
try{
|
||
|
base64 = "data:image/jpeg;base64,"+Base64.encodeBase64String(byteArrayOutputStream.toByteArray());
|
||
|
}finally{
|
||
|
try {
|
||
|
if(byteArrayOutputStream!=null) {
|
||
|
byteArrayOutputStream.close();
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
return base64;
|
||
|
}
|
||
|
}
|