文档章节

upyun图片处理简单封装

lindeyi
 lindeyi
发布于 2016/11/21 09:13
字数 3809
阅读 40
收藏 0

package com;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import org.json.JSONArray;
import org.json.JSONObject;

import com.UpYun.FolderItem;
import com.UpYun.PARAMS;
import com.upyun.FormUploader;
import com.upyun.Params;
import com.upyun.Result;

/**
 * 又拍云文件处理
 * <pre>
 * date: 2016年9月28日 上午9:48:49 
 * </pre>
 * @ClassName: FileUtils   
 * @author deyi
 * @version V1.0
 */
public class UpYunFileUtils {
	
	/**服务名称*/
	private static  String BUCKET_NAME;
	/**操作员*/
	private static  String OPERATOR_NAME;
	/**操作员密码*/
	private static  String OPERATOR_PWD;
	/**API key*/
	private static  String APIKEY;
	
	/**大水印url*/
	private static final String WATERMARK_LARGE="/watermark/large.png";
	/**正常水印url*/
	private static final String WATERMARK="/watermark/watermark.png";
	/**小水印url*/
	private static final String WATERMARK_SMALL="/watermark/small.png";
	/**默认水印透明度*/
	private static final int DEFAULT_OPACITY = 80;
	private static UpYun upyun;
	private static FormUploader uploader;
	private final static String SMALL="_small";;
	
	public static void init(String bucketName,String operatorName,String operatorPwd,String apikey){
		BUCKET_NAME = bucketName;
		OPERATOR_NAME = operatorName;
		OPERATOR_PWD = operatorPwd;
		APIKEY = apikey;
		upyun = new UpYun(BUCKET_NAME, OPERATOR_NAME, OPERATOR_PWD);
		uploader = new FormUploader(BUCKET_NAME, APIKEY, null);
	}
	
	/**
	 * 检查是否已经初始化
	 * @Title: checkInitialized   
	 * @return void
	 * @author	deyi
	 * @date 2016年9月29日 上午10:05:23   
	 * @version V1.0
	 * @throws
	 */
	private static void checkInitialized(){
		if (upyun == null || uploader == null) {
			throw new RuntimeException(" Upyun Not Initialized!");
		}
	}
	/**
	 * 获取图片信息
	 * @Title: getInfo   
	 * @param imgPath
	 * @return Map<String,String>
	 * @author	deyi
	 * @date 2016年9月28日 下午5:20:55   
	 * @version V1.0
	 * @throws
	 */
	public static Map<String,String> getInfo(String imgPath){
		checkInitialized();
		return upyun.getFileInfo(imgPath);
	}
	
	/**
	 * 读取文件
	 * @Title: readFile   
	 * @param filePath
	 * @return String
	 * @author	deyi
	 * @date 2016年9月28日 下午5:55:09   
	 * @version V1.0
	 * @throws
	 */
	public static String readFile(String filePath){
		checkInitialized();
		return upyun.readFile(filePath);
	}
	
	/**
	 * 读取文件
	 * @Title: readFile   
	 * @param filePath
	 * @param file
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午5:55:26   
	 * @version V1.0
	 * @throws
	 */
	public static boolean readFile(String filePath,File file){
		checkInitialized();
		return upyun.readFile(filePath, file);
	}
	
	/**
	 * 读取目录
	 * @Title: readDir   
	 * @param filePath
	 * @return List<FolderItem>
	 * @author	deyi
	 * @date 2016年9月28日 下午5:55:42   
	 * @version V1.0
	 * @throws
	 */
	public static List<FolderItem> readDir(String filePath){
		checkInitialized();
		return upyun.readDir(filePath);
	}
	
	/**
	 * 删除文件
	 * @Title: deleteFile   
	 * @param filePath
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午5:55:58   
	 * @version V1.0
	 * @throws
	 */
	public static boolean deleteFile(String filePath){
		checkInitialized();
		return  upyun.deleteFile(filePath);
	}
	
	/**
	 * 判断是否为图片
	 * @Title: isImage   
	 * @param imageFile
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月29日 下午2:05:38   
	 * @version V1.0
	 * @throws
	 */
	public static boolean isImage(File imageFile) {  
	       if (!imageFile.exists()) {  
	           return false;  
	       }  
	       BufferedImage img = null;  
	       try {  
	           img = ImageIO.read(imageFile);  
	           if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {  
	               return false;  
	           }  
	           return true;  
	       } catch (Exception e) {  
	           return false;  
	       } finally {  
	           img = null;  
	       }  
    } 
	
	/**
	 * 判断是否为图片
	 * @Title: isImage   
	 * @param io
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月30日 上午9:37:01   
	 * @version V1.0
	 * @throws
	 */
	public static boolean isImage(InputStream io) {  
	       if (io == null) {  
	           return false;  
	       }  
	       BufferedImage img = null;  
	       try {  
	           img = ImageIO.read(io);  
	           if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {  
	               return false;  
	           }  
	           return true;  
	       } catch (Exception e) {  
	           return false;  
	       } finally {  
	           img = null;  
	       }  
 } 
	
	/**
	 * 
	 * 上传 (基础)
	 * @Title: upload   
	 * @param filePath
	 * @param datas
	 * @param params
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午1:53:31   
	 * @version V1.0
	 * @throws
	 */
	public static boolean upload(String filePath,byte[] datas,Map<String,String> params){
		checkInitialized();
		return upyun.writeFile(filePath, datas, true, params);
	}
	
	/**
	 * @Title: upload   
	 * @param filePath
	 * @param file
	 * @param params
	 * @throws IOException (参数说明) 
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月30日 上午9:36:39   
	 * @version V1.0
	 * @throws
	 */
	public static boolean upload(String filePath,File file,Map<String,String> params) throws IOException{
		checkInitialized();
		return upyun.writeFile(filePath, file, true, params);
	}
	
	/**
	 * 上传文件 (自动区分普通和非图片,图片可以设置缩略图与水印)
	 * @Title: upload   
	 * @param filePath
	 * @param stream
	 * @param makeSmallPath 图片情况下才生效
	 * @param waterMark 图片情况下才生效
	 * @throws IOException (参数说明) 
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月30日 上午9:54:13   
	 * @version V1.0
	 * @throws
	 */
	public static boolean upload(String filePath,InputStream stream,String makeSmallPath,boolean waterMark) throws IOException{
		boolean result = false;
		BufferedImage image=ImageIO.read(stream); 
		if (image == null || image.getWidth(null) <= 0 || image.getHeight(null) <= 0) {  
			result = upload(filePath, toByteArray(stream), null);//非图片
        } else {
        	int width = image.getWidth();//宽
    		int height = image.getHeight();//高
    		int min = Math.min(width, height);
    		ImgHandle handle=new ImgHandle(filePath);
    		ImgHandle smallHandle =null;
    		if (waterMark) {//水印
	    		if (min > 1000) {
	    			handle.addWatermark(pk(WATERMARK_LARGE));
	    		} else if (min > 500){
	    			handle.addWatermark(pk(WATERMARK));
	    		} else {
	    			handle.addWatermark(pk(WATERMARK_SMALL));
	    		}
    		}
			
			if (null != makeSmallPath && !"".equals(makeSmallPath)) { //需要缩略图
				smallHandle = new ImgHandle(makeSmallPath).sq(120);
			}
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			String type = filePath.substring(filePath.lastIndexOf(".")+1);
	        ImageIO.write(image,type, out);  
	        byte[] b = out.toByteArray(); 
			result = uploadImgBySync(b, handle, smallHandle);
        }
	
		return result;
	}
	
	public static byte[] toByteArray(InputStream input) throws IOException {
	    ByteArrayOutputStream output = new ByteArrayOutputStream();
	    byte[] buffer = new byte[4096];
	    int n = 0;
	    while (-1 != (n = input.read(buffer))) {
	        output.write(buffer, 0, n);
	    }
	    return output.toByteArray();
	}
	/**
	 * 图片上传 (自动加水印)
	 * @Title: uploadImgAutoWaterMark 
	 * @param imgPath
	 * @param stream
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午1:52:31   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImgAutoAddWaterMark(String imgPath,InputStream stream) throws IOException{
		BufferedImage image=ImageIO.read(stream); 
		int width = image.getWidth();//宽
		int height = image.getHeight();//高
		int min = Math.min(width, height);
		ImgHandle handle = new ImgHandle();
		if (min > 1000) {
			handle.addWatermark(pk(WATERMARK_LARGE));
		} else if (min > 500){
			handle.addWatermark(pk(WATERMARK));
		} else {
			handle.addWatermark(pk(WATERMARK_SMALL));
		}
		handle.saveAs = imgPath;
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		String type = imgPath.substring(imgPath.lastIndexOf(".")+1);
        ImageIO.write(image,type, out);  
        byte[] b = out.toByteArray(); 
		return uploadImg(b, handle);
	}
	
	private static Watermark pk(String url) throws IOException{
		Map<String, String> info = getInfo(url);
		if(info == null || info.size() != 3){
			if(info != null){
				for(String k:info.keySet()){
					System.out.println(k+"="+info.get(k));
				}
			}
			throw new IOException(url+" 404 Not Found");
		}
		Watermark w=new Watermark();
		w.url(url);
		w.align(ALIGN.SouthEast);
		w.opacity(DEFAULT_OPACITY).animate();
		return w;
	}
	
	
	/**
	 * 图片上传 并处理
	 * @Title: uploadImg   
	 * @param imgPath
	 * @param imgs
	 * @param handle
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午1:53:53   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImg(byte[] imgs,ImgHandle handle) throws IOException{
		Map<String,String> params =new HashMap<String, String>();
		if(null != handle && !handle.isEmpty()){
			params.put(PARAMS.KEY_X_GMKERL_THUMB.getValue(), handle.getParams());
		}
		String imgPath=handle.saveAs;
		if(null == imgPath || "".equals(imgPath)){
			throw new IOException("img save path not Found");
		}
		return upload(imgPath, imgs, params);
	}
	
	
	/**
	 * 上传图片加水印
	 * @Title: uploadImgAddWaterMarks   
	 * @param imgPath
	 * @param imgs
	 * @param watermarks
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午2:09:48   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImgAddWaterMarks(String imgPath,byte[] imgs,Watermark ... watermarks) throws IOException{
		ImgHandle handle = new ImgHandle();
		handle.saveAs = imgPath;
		if(watermarks != null){
			for(Watermark w:watermarks){
				handle.addWatermark(w);
			}
		}
		
		return uploadImg(imgs, handle);
	}
	
	/**
	 * 上传图片并生成缩略图 异步(在又拍云服务器上操作,在原图基础上操作缩放)
	 * @Title: uploadImgAndMakeSmallByAsync   
	 * @param imgPath
	 * @param imgs
	 * @param width
	 * @param height
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午2:54:34   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImgAndMakeSmallByAsync(byte[] imgs,ImgHandle handle,int width,int height) throws IOException{
		String imgPath=handle.saveAs;
		if(null == imgPath || "".equals(imgPath)){
			throw new IOException("img save path not Found");
		}
		Map<String, Object> paramsMap = new HashMap<String, Object>();
	    paramsMap.put(Params.SAVE_KEY, imgPath);
	    JSONArray jsons=new JSONArray();
	    JSONObject json=new JSONObject();
	    String params = new ImgHandle().both(width, height).getParams();
	    json.put("name", "thumb");
	    json.put(Params.X_GMKERL_THUMB, params);//缩略图作图
	    String smallImgPath =smallFilePath(imgPath);
	    json.put("save_as", smallImgPath);
	    jsons.put(json);
	    paramsMap.put(Params.APPS, jsons);
	    if(null != handle && !handle.isEmpty()){
	    	paramsMap.put(Params.X_GMKERL_THUMB, handle.getParams());//原图作图
	    }
	    checkInitialized();
		Result result = uploader.upload(paramsMap, imgs);
		if(200 == result.getCode()){ //成功
			return true;
		}
		return false;
	}
	
	
	public static String smallFilePath(String name){
		int lastIndexOf = name.lastIndexOf(".");
		
		if (lastIndexOf == -1) {
			return name+SMALL;
		}
		return name.substring(0,lastIndexOf)+SMALL+name.substring(lastIndexOf);
	}
	
	
	/**
	 * 上传图片异步作图
	 * @Title: uploadImgByAsync   
	 * @param imgPath
	 * @param imgs
	 * @param handle
	 * @param smallHandles
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午3:48:45   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImgByAsync(byte[] imgs,ImgHandle handle,ImgHandle ... smallHandles) throws IOException{
		String imgPath=handle.saveAs;
		if(null == imgPath || "".equals(imgPath)){
			throw new IOException("img save path not Found");
		}
		Map<String, Object> paramsMap = new HashMap<String, Object>();
	    paramsMap.put(Params.SAVE_KEY, imgPath);
	    if (null != smallHandles && smallHandles.length > 0){
	    	//处理异步图片制作
	    	JSONArray jsons=new JSONArray();
	    	for (int i=0;i<smallHandles.length;i++){
	    		ImgHandle h = smallHandles[i];
	    		JSONObject json=new JSONObject();
		  	    json.put("name", "thumb");
		  	    json.put(Params.X_GMKERL_THUMB, h.getParams());//缩略图作图
		  	    String smallImgPath = h.saveAs;
		  	    if(null == smallImgPath || "".equals(smallImgPath)){
		  	    	smallImgPath=smallFilePath(imgPath);
		  	    }
		  	    json.put("save_as", smallImgPath);
		  	    jsons.put(json);
	    	}
	  	    paramsMap.put(Params.APPS, jsons);
		}
	  
	    if(null != handle && !handle.isEmpty()){
	    	paramsMap.put(Params.X_GMKERL_THUMB, handle.getParams());//原图作图
	    }
	    checkInitialized();
		Result result = uploader.upload(paramsMap, imgs);
		if(200 == result.getCode()){ //成功
			return true;
		}
		return false;
	}
	
	
	/**
	 * 上传图片 同步作图
	 * @Title: uploadImgBySync   
	 * @param imgPath
	 * @param imgs
	 * @param handle
	 * @param smallHandle
	 * @return boolean
	 * @author	deyi
	 * @date 2016年9月28日 下午3:33:28   
	 * @throws IOException 
	 * @version V1.0
	 * @throws
	 */
	public static boolean uploadImgBySync(byte[] imgs,ImgHandle handle,ImgHandle smallHandle) throws IOException{
		boolean result = uploadImg( imgs, handle);
		if(result && null != smallHandle && !smallHandle.isEmpty()){
			result=uploadImg(imgs,smallHandle);
		}
		return result;
	}
	
	
	
}

ImgHandle.java


package com;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.upyun.Base64Coder;

/**
 * 图片处理
 * <pre>
 * date: 2016年9月28日 下午12:47:56 
 * </pre>
 * @ClassName: ImgHandle   
 * @author deyi
 * @version V1.0
 */
public class ImgHandle {
		//图片处理集合
		Map<String,String> handle=new LinkedHashMap<>();
		//水印处理集合
		List<Watermark> watermarks=new ArrayList<>();
		
		String saveAs;
		
		public ImgHandle(){}
		
		public ImgHandle(String saveAs){
			this.saveAs=saveAs;
		}
		public boolean isEmpty(){
			return handle.isEmpty() && watermarks.isEmpty();
		}
		//获取map参数
		public String getParams(){
			StringBuffer sb=new StringBuffer();
			Set<String> set = this.handle.keySet();
			for(String k:set){
				sb.append('/').append(k).append('/').append(handle.get(k));
			}
			for(Watermark w:watermarks){
				sb.append("/watermark").append(w.getParams());
				
			}
			return sb.toString();
		}
		
		/**
		 * 限定宽度,高度自适应
		 * @Title: fw   
		 * @param maxWidth
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:38:43   
		 * @version V1.0
		 * @throws
		 */
		public  ImgHandle fw(int maxWidth){
			this.handle.put("fw", String.valueOf(maxWidth));
			return this;
		}
		
		/**
		 * 限定高度,宽度自适应
		 * @Title: fh   
		 * @param maxHeight
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:39:02   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle fh(int maxHeight){
			this.handle.put("fh", String.valueOf(maxHeight));
			return this;
		}
		
		/**
		 * 限定最长边,短边自适应
		 * @Title: max   
		 * @param max
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:39:24   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle max(int max){
			this.handle.put("max", String.valueOf(max));
			return this;
		}
		
		/**
		 * 限定最短边,长边自适应
		 * @Title: min   
		 * @param min
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:39:42   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle min(int min){
			this.handle.put("min", String.valueOf(min));
			return this;
		}
		
		/**
		 * 限定宽度或高度,宽高不足时不缩放 
		 * @Title: fwfh   
		 * @param width
		 * @param height
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:39:51   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle fwfh(int width,int height){
			this.handle.put("fwfh", width+"x"+height);
			return this;
		}
		
		/**
		 * 固定宽度和高度,宽高不足时居中裁剪再缩放 
		 * @Title: both   
		 * @param width
		 * @param height
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:40:07   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle both(int width,int height){
			this.handle.put("both", width+"x"+height);
			return this;
		}
		
		/**
		 * 图片缩放成正方形,宽高相等
		 * @Title: sq   
		 * @param width
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:40:25   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle sq(int width){
			this.handle.put("sq", String.valueOf(width));
			return this;
		}
		
		/**
		 * 缩放比例,如 50	宽高等比例缩放,取值范围 [1-1000] 
		 * @Title: scale   
		 * @param size
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:40:38   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle scale(int size){
			this.handle.put("scale", String.valueOf(size));
			return this;
		}
		
		/**
		 * 宽度按比例缩放,高度不变,取值范围 [1-1000]
		 * @Title: wscale   
		 * @param size
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:41:00   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle wscale(int size){
			this.handle.put("wscale", String.valueOf(size));
			return this;
		}
		
		/**
		 * 高度按比例缩放,宽度不变,取值范围 [1-1000]
		 * @Title: hscale   
		 * @param size
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:41:19   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle hscale(int size){
			this.handle.put("hscale", String.valueOf(size));
			return this;
		}
		
		/**
		 * 限定长边或短边,进行等比缩放,不裁剪
		 * @Title: fxfn   
		 * @param width
		 * @param height
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:41:36   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle fxfn(int width,int height){
			this.handle.put("fxfn", width+"x"+height);
			return this;
		}
		
		/**
		 * 限定长边或短边的最小值,进行等比缩放,不裁剪
		 * @Title: fxfn2   
		 * @param width
		 * @param height
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:41:51   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle fxfn2(int width,int height){
			this.handle.put("fxfn2", width+"x"+height);
			return this;
		}
		
		/**
		 * 宽高等比例缩放,直到宽高像素积小于但最接近指定值,取值范围 [1-25000000]
		 * @Title: fp   
		 * @param px
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:42:03   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle fp(int px){
			this.handle.put("fp", String.valueOf(px));
			return this;
		}
		
		/**
		 * 支持放大的参数,可以指定  为 true 进行图片放大
		 * @Title: force   
		 * @param f
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:42:30   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle force(boolean f){
			this.handle.put("force", String.valueOf(f));
			return this;
		}
		
		/**
		 * 图片缩放前裁剪
		 * @Title: crop   
		 * @param width
		 * @param height
		 * @param x
		 * @param y
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:44:00   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle crop(int width,int height,int x,int y){
			this.handle.put("crop", width+"x"+height+((x>0)?"a":"s")+x+((y>0)?"a":"s")+y);
			return this;
		}
		
		/**
		 * 图片缩放后裁剪
		 * @Title: clip   
		 * @param width
		 * @param height
		 * @param x
		 * @param y
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:44:19   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle clip(int width,int height,int x,int y){
			this.handle.put("clip", width+"x"+height+((x>0)?"a":"s")+x+((y>0)?"a":"s")+y);
			return this;
		}
			
		/**
		 * 位置,如 north	裁剪开始的方位,默认是 northwest
		 * @Title: gravity   
		 * @param align
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:44:32   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle gravity(ALIGN align){
			this.handle.put("gravity",align.getValue());
			return this;
		}
		
		
		/**
		 * 水印处理
		 * @Title: addWatermark   
		 * @param watermark
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:44:55   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle addWatermark(Watermark watermark){
			this.watermarks.add(watermark);
			return this;
		}

		/**
		 * 旋转 自动扶正
		 * @Title: rotate   
		 * @param align
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 上午11:52:41   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle rotate(){
			this.handle.put("rotate","auto");
			return this;
		}
		
		/**
		 * 按角度旋转
		 * @Title: rotate   
		 * @param d (0, 360],如 90 度
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 上午11:54:32   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle rotate(int d){
			this.handle.put("rotate",String.valueOf(d));
			return this;
		}
		
		/**
		 * 翻转方向
		 * @Title: flip   
		 * @param flip 如 left,right	翻转方向,可选值:left,right,top,down
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 上午11:59:02   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle flip(String flip){
			this.handle.put("flip",flip);
			return this;
		}
		/**
		 * 锐化
		 * @Title: unsharp   
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:30:33   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle unsharp(){
			this.handle.put("unsharp","true");
			return this;
		}
		
		/**
		 * 高斯模糊
		 * @Title: gaussblur   
		 * @param radius 半径; 0 <= radius <= 50 且 radius 是整数;当 radius = 0 时,raduis 根据 sigma 自动计算产生。
		 * @param sigma  必须为正整数
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:31:45   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle gaussblur(int radius,int sigma){
			this.handle.put("gaussblur",radius+"x"+sigma);
			return this;
		}
		
		/**
		 * 边框 大小
		 * @Title: border   
		 * @param width 左右
		 * @param height 上下
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:33:49   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle border(int width,int height){
			this.handle.put("border",width+"x"+height);
			return this;
		}
		
		/**
		 * 边框颜色和透明度 (默认值是 FFFFFF00(白色不透明))
		 * @Title: brdcolor   
		 * @param color rgb
		 * @param p [0-255]
		 * @return ImgHandle
		 * @author	deyi
		 * @date 2016年9月28日 下午12:35:30   
		 * @version V1.0
		 * @throws
		 */
		public ImgHandle brdcolor(String color,int p){
			if(p>255)p=255;
			if(p<0)p=0;
			String hex = Integer.toHexString(p);
			this.handle.put("brdcolor", (color+(hex.length()>1?hex:"0"+hex)).toUpperCase());
			return this;
		}
		
	}
	
	/**
	 * 位置
	 * <pre>
	 * date: 2016年9月28日 上午11:07:58 
	 * </pre>
	 * @ClassName: GRAVITY   
	 * @author deyi
	 * @version V1.0
	 */
	enum ALIGN{
		//northwest     |     north      |     northeast
		//	          |                |
		//	          |                |
			//--------------+----------------+--------------
		//	          |                |
			//west          |     center     |          east
		//	          |                |
			//--------------+----------------+--------------
		//	          |                |
		//	          |                |
			//southwest     |     south      |     southeast
		/**
		 * 西北
		 */
		NorthWest("northwest"),
		/**
		 * 正北
		 */
		North("north"),
		/**
		 * 东北
		 */
		NorthEast("northeast"),
		/**
		 * 正西
		 */
		West("west"),
		/**
		 * 正中
		 */
		Center("center"),
		/**
		 * 正东
		 */
		East("east"),
		/**
		 * 西南
		 */
		SouthWest("southwest"),
		/**
		 * 正南
		 */
		South("south"),
		/**
		 * 东南
		 */
		SouthEast("southeast");
		private final String value;
		ALIGN(String value){
			this.value=value;
		}
		public String getValue() {
			return value;
		}
		
	}
	
	/**
	 * 字体
	 * <pre>
	 * date: 2016年9月28日 上午11:48:06 
	 * </pre>
	 * @ClassName: FONT   
	 * @author deyi
	 * @version V1.0
	 */
	enum FONT{
		//宋体	中文字体	simsun
		宋体("simsun"),
		//黑体	中文字体	simhei
		黑体("simhei"),
		//楷体	中文字体	simkai
		楷体("simkai"),
		//隶书	中文字体	simli
		隶书("simli"),
		//幼圆	中文字体	simyou
		幼圆("simyou"),
		//仿宋	中文字体	simfang
		仿宋("simfang"),
		//简体中文	中文字体	sc
		简体中文("sc"),
		//繁体中文	中文字体	tc
		繁体中文("tc"),
		//Arial	英文字体	arial
		Arial("arial"),
		//Georgia	英文字体	georgia
		Georgia("georgia"),
		//Helvetica	英文字体	helvetica
		Helvetica("helvetica"),
		//Times-New-Roman	英文字体	roman
		TimesNewRoman("roman");
		private final String value;
		FONT(String value){
			this.value=value;
		}
		public String getValue() {
			return value;
		}
	}
	
	
	/**
	 * 水印处理
	 * <pre>
	 * date: 2016年9月28日 上午10:54:17 
	 * </pre>
	 * @ClassName: Watermark   
	 * @author deyi
	 * @version V1.0
	 */
	class Watermark{
		Map<String,String> params=new LinkedHashMap<>();

		public String getParams(){
			StringBuffer sb=new StringBuffer();
			for(String k:params.keySet()){
				sb.append('/').append(k).append('/').append(params.get(k));
			}
			return sb.toString();
		}
		/**
		 * 图片水印路径
		 * @Title: url   
		 * @param imgpath
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:41:21   
		 * @version V1.0
		 * @throws
		 */
		public Watermark url(String imgpath){
			String path = Base64Coder.encodeString(imgpath);
			this.params.put("url",path.replaceAll("/", "|"));
			return this;
		}
		
		/**
		 * 位置
		 * @Title: align   
		 * @param align
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:41:55   
		 * @version V1.0
		 * @throws
		 */
		public Watermark align(ALIGN align){
			this.params.put("align",align.getValue());
			return this;
		}
		
		/**
		 * 偏移数
		 * @Title: margin   
		 * @param x
		 * @param y
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:42:16   
		 * @version V1.0
		 * @throws
		 */
		public Watermark margin(int x,int y){
			this.params.put("margin", x+"x"+y);
			return this;
		}
		
		/**
		 * 透明度
		 * @Title: opacity   
		 * @param opacity 取值范围 [0-100],值越大越不透明,0 完全透明,100 完全不透明
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:42:54   
		 * @version V1.0
		 * @throws
		 */
		public Watermark opacity(int opacity){
			this.params.put("opacity", String.valueOf(opacity));
			return this;
		}
		
		/**
		 * 
		 * 允许对动态图片加水印 默认false
		 * @Title: animate   
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:43:20   
		 * @version V1.0
		 * @throws
		 */
		public Watermark animate(){
			this.params.put("animate", "true");
			return this;
		}
		
		/**
		 * 文字内容
		 * @Title: text   
		 * @param text
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:46:11   
		 * @version V1.0
		 * @throws
		 */
		public Watermark text(String text){
			String base = Base64Coder.encodeString(text);
			this.params.put("text",base.replaceAll("/", "|"));
			return this;
		}
		
		/**
		 * 文字大小,单位 px
		 * @Title: size   
		 * @param size
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:46:36   
		 * @version V1.0
		 * @throws
		 */
		public Watermark size(int size){
			this.params.put("size", String.valueOf(size));
			return this;
		}
		
		/**
		 * 文字字体 默认宋体
		 * @Title: font   
		 * @param font
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:46:58   
		 * @version V1.0
		 * @throws
		 */
		public Watermark font(FONT font){
			this.params.put("font", font.getValue());
			return this;
		}
		
		/**
		 * 字体颜色
		 * @Title: color   
		 * @param color
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:47:18   
		 * @version V1.0
		 * @throws
		 */
		public Watermark color(String color){
			this.params.put("color", color.toUpperCase());
			return this;
		}
		
		/**
		 * 文字描边
		 * @Title: border   
		 * @param color rgb
		 * @param p 取值 [0-255],值越大越透明,00 表示完全不透明,FF 表示完全透明。
		 * @return Watermark
		 * @author	deyi
		 * @date 2016年9月28日 上午11:30:26   
		 * @version V1.0
		 * @throws
		 */
		public Watermark border(String color,int p){
			if(p>255)p=255;
			if(p<0)p=0;
			String hex = Integer.toHexString(p);
			this.params.put("border", (color+(hex.length()>1?hex:"0"+hex)).toUpperCase());
			return this;
		}
}

 

© 著作权归作者所有

lindeyi
粉丝 5
博文 16
码字总数 14150
作品 0
海淀
私信 提问
又拍推出中小型开发者扶助支持计划,每月赠10G空间,15G流量

7月14日最新消息,UPYUN(又拍云)正式推出UPYUN联盟计划 。此计划主要面向中小型开发者,加入UPYUN联盟,每月可免费获赠10G空间和15G流量。 什么是UPYUN联盟? UPYUN 联盟是 UPYUN 推出的一...

荒野无灯
2014/07/15
0
0
CKEditor 又拍云上传插件新鲜出炉!

What is CKEditor? CKEditor 是一个基于网页的开源 WYSIWYG 编辑器。CKEditor 因为十分轻便,很容易在不同的环境中嵌入。 How to install origin CKEditor? Ckeditor 的安装十分简单,下载链...

又拍云
2016/12/30
0
0
UPYUN体验邀请计划圆满结束,获奖名单公布……

感谢大家的认真撰写,本次获得2000元UPYUN代金券的名单如下,@UPYUN-又拍云 将会通过站内留言联系各位发放奖品,请各位中奖者注意您的站内留言。 @sunbaoming @lorinnn @TianPad @程梁 @Gar...

又拍云
2014/03/24
4.8K
51
UpYun体验之Java SDK

申明:本文只希望做技术探讨,无其它意思。 目前我的工作主要使用的还是Java。所以,我决定使用UpYun官方提供的Java版的SDK体验下UpYun。 原SDK存在问题 当使用IDE打开源码来看时,我发现这个...

翟志军
2014/04/04
0
5
OSC职位推荐:又拍云疯了,招人都不看学历背景

你知道“中国的Flickr“是谁吗?是又拍网哦。不过后来又拍网大力发展云存储了,变成了现在的又拍云(UPYUN)。现如今UPYUN是全国第一家将海量多媒体文件(图片、音视频)的网络加速、云端存储...

oschina
2015/08/07
6.8K
32

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 请务必让我分担他们的痛苦!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy :分享石元丈晴的单曲《Why》: 《Why》- 石元丈晴 手机党少年们想听歌,请使劲儿戳(这里) @一代码哥 :当他妈狗屁的程序员,天天...

小小编辑
今天
241
4
php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
9
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
6
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部