/*
 *
 * 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;
	}
}