View Javadoc
1   /**
2    * Copyright By Grandsoft Company Limited.  
3    * 2012-9-20 下午06:31:02
4    */
5   package gboat2.attachment.watermark;
6   
7   import org.im4java.core.ConvertCmd;
8   import org.im4java.core.IMOperation;
9   import org.im4java.core.Info;
10  
11  /**
12   * 高性能水印处理方案
13   * @author tanxw
14   * @since jdk1.6
15   * @date 2012-9-20
16   */
17  public class IM4JavaWatermarkStrategy implements WatermarkStrategy {
18  	
19  	public static void main(String[] args) {
20  		try {
21  			//            cropImage("D:/pic/aaa.jpg", "D:/pic/bbb.jpg", 1024, 768, 600, 600);图片裁剪
22  			//            showImageInfo("D:/pic/aaa.jpg");                                  图片信息
23  			//            rotate("D:/pic/aaa.jpg", "D:/pic/ddb.jpg",50);                    图片旋转
24  			//waterMark("c:/watermark.gif", "c:/1.jpg", "c:/2.jpg", "southeast", 100);
25  			new IM4JavaWatermarkStrategy().watermark("c:/1.jpg", "c:/2.jpg", "c:/watermark.gif");
26  			//            long s = System.currentTimeMillis();
27  			//            for (int i = 0; i < 10; i++) {
28  			//                waterMark("D:/pic/mark.png", "D:/pic/ddb.jpg", "D:/pic/aaac"+ i+".jpg", "southeast", 100);
29  			//                System.out.println("ok"+i);
30  			//            }
31  			//System.out.println("ok" + (System.currentTimeMillis() - s));
32  		} catch (Exception e) {
33  			e.printStackTrace();
34  		}
35  		
36  	}
37  	
38  	@Override
39  	public void watermark(String srcImagePath, String destImagePath, String waterImagePath) throws Exception {
40  		
41  		Info imgInfo;
42  		int imgWidth = 0, imgHeight = 0, waterWidth = 0, waterHeight = 0;
43  		try {
44  			imgInfo = new Info(srcImagePath, true);
45  			imgWidth = imgInfo.getImageWidth();
46  			imgHeight = imgInfo.getImageHeight();
47  			imgInfo = new Info(waterImagePath, true);
48  			waterWidth = imgInfo.getImageWidth();
49  			waterHeight = imgInfo.getImageHeight();
50  			
51  			IMOperation op = new IMOperation();
52  			//op.gravity(gravity);
53  			op.addImage(srcImagePath);
54  			String waterSize = String.valueOf(waterWidth) + "," + String.valueOf(waterHeight);
55  			//开始打水印,从左上角开始;如果到右边界则重新开始一行的打印(x=0,y=y+h)
56  			int startX = 0;
57  			int startY = 0;
58  			String position = String.valueOf(startX) + "," + String.valueOf(startY);
59  			do {
60  				op.draw("image Over " + position + " " + waterSize + " " + waterImagePath);
61  				//改变坐标,调整图片水印密度
62  				startX += (waterWidth + 50);
63  				if (startX >= imgWidth) {
64  					startY += waterHeight * 2;
65  					startX = 0;
66  				}
67  				position = String.valueOf(startX) + "," + String.valueOf(startY);
68  			} while (startY <= imgHeight);
69  			op.addImage(destImagePath);
70  			ConvertCmd cmd = new ConvertCmd(true);
71  			cmd.run(op);
72  		} catch (Exception e1) {
73  			throw new Exception(e1);
74  		}
75  	}
76  	
77  	//	/**
78  	//	 * 图片水印
79  	//	 *
80  	//	 * @param srcImagePath   源图片
81  	//	 * @param waterImagePath 水印
82  	//	 * @param destImagePath  生成图片
83  	//	 * @param gravity  图片位置
84  	//	 * @param dissolve 水印透明度
85  	//	 * @throws Exception 
86  	//	 */
87  	//	public static void waterMark(String waterImagePath, String srcImagePath, String destImagePath, String gravity,
88  	//	        int dissolve) throws Exception {
89  	//		IMOperation op = new IMOperation();
90  	//		op.gravity(gravity);
91  	//		op.dissolve(dissolve);
92  	//		op.addImage(waterImagePath);
93  	//		op.addImage(srcImagePath);
94  	//		op.addImage(destImagePath);
95  	//		CompositeCmd cmd = new CompositeCmd(false);
96  	//		try {
97  	//			cmd.run(op);
98  	//		} catch (Exception e) {
99  	//			throw new Exception(e);
100 	//		}
101 	//	}
102 	//	/**
103 	//	 * 图片旋转
104 	//	 *
105 	//	 * @param srcImagePath
106 	//	 * @param destImagePath
107 	//	 * @param angle
108 	//	 */
109 	//	public static void rotate(String srcImagePath, String destImagePath, double angle) {
110 	//		try {
111 	//			IMOperation op = new IMOperation();
112 	//			op.rotate(angle);
113 	//			op.addImage(srcImagePath);
114 	//			op.addImage(destImagePath);
115 	//			ConvertCmd cmd = new ConvertCmd(true);
116 	//			cmd.run(op);
117 	//		} catch (Exception e) {
118 	//			e.printStackTrace();
119 	//		}
120 	//	}
121 	//	
122 	//	/**
123 	//	 * 图片信息
124 	//	 *
125 	//	 * @param imagePath
126 	//	 * @return
127 	//	 */
128 	//	public static String showImageInfo(String imagePath) {
129 	//		String line = null;
130 	//		try {
131 	//			IMOperation op = new IMOperation();
132 	//			op.format("%w#%h#%d#%f#%b#%[EXIF:DateTimeOriginal]");
133 	//			op.addImage(1);
134 	//			IdentifyCmd identifyCmd = new IdentifyCmd();
135 	//			ArrayListOutputConsumer output = new ArrayListOutputConsumer();
136 	//			identifyCmd.setOutputConsumer(output);
137 	//			identifyCmd.run(op, imagePath);
138 	//			ArrayList<String> cmdOutput = output.getOutput();
139 	//			assert cmdOutput.size() == 1;
140 	//			line = cmdOutput.get(0);
141 	//			
142 	//		} catch (Exception e) {
143 	//			e.printStackTrace();
144 	//		}
145 	//		return line;
146 	//	}
147 	//	
148 	//	/**
149 	//	 * 图片裁剪,等比压缩
150 	//	 *
151 	//	 * @param srcPath 源图片
152 	//	 * @param desPath 处理后图片
153 	//	 * @param sw      源图片宽
154 	//	 * @param sh      源图片高
155 	//	 * @param dw      处理后图片宽
156 	//	 * @param dh      处理后图片高
157 	//	 * @throws Exception
158 	//	 */
159 	//	public static void cropImage(String srcPath, String desPath, int sw, int sh, int dw, int dh) throws Exception {
160 	//		if (sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
161 	//			return;
162 	//		}
163 	//		
164 	//		IMOperation op = new IMOperation();
165 	//		op.addImage();
166 	//		
167 	//		// 如果源图宽度和高度都小于目标宽高,则仅仅压缩图片
168 	//		if ((sw <= dw) && (sh <= dh)) {
169 	//			op.resize(sw, sh);
170 	//		}
171 	//		
172 	//		// 如果源图宽度小于目标宽度,并且源图高度大于目标高度
173 	//		if ((sw <= dw) && (sh > dh)) {
174 	//			op.resize(sw, sh); // 压缩图片
175 	//			op.append().crop(sw, dh, 0, (sh - dh) / 2); // 切割图片
176 	//		}
177 	//		
178 	//		// 如果源宽度大于目标宽度,并且源高度小于目标高度
179 	//		if ((sw > dw) && (sh <= dh)) {
180 	//			op.resize(sw, sh);
181 	//			op.append().crop(dw, sh, (sw - dw) / 2, 0);
182 	//		}
183 	//		
184 	//		// 如果源图宽、高都大于目标宽高
185 	//		if (sw > dw && sh > dh) {
186 	//			float ratiow = (float) dw / sw; // 宽度压缩比
187 	//			float ratioh = (float) dh / sh; // 高度压缩比
188 	//			
189 	//			// 宽度压缩比小(等)于高度压缩比(是宽小于高的图片)
190 	//			if (ratiow >= ratioh) {
191 	//				int ch = (int) (ratiow * sh); // 压缩后的图片高度
192 	//				op.resize(dw, ch); // 按目标宽度压缩图片
193 	//				op.append().crop(dw, dh, 0, (ch > dh) ? ((ch - dh) / 2) : 0); // 根据高度居中切割压缩后的图片
194 	//			} else { // (宽大于高的图片)
195 	//				int cw = (int) (ratioh * sw); // 压缩后的图片宽度
196 	//				op.resize(cw, dh); // 按计算的宽度进行压缩
197 	//				op.append().crop(dw, dh, (cw > dw) ? ((cw - dw) / 2) : 0, 0); // 根据宽度居中切割压缩后的图片
198 	//			}
199 	//		}
200 	//		
201 	//		op.addImage();
202 	//		ConvertCmd convert = new ConvertCmd(true);
203 	//		convert.run(op, srcPath, desPath);// BufferedImage or String
204 	//	}
205 }