ecology_maven/weaver/fna/invoice/utils/ImageUtil.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;
}
}