View Javadoc
1   package gboat2.attachment.watermark;
2   
3   import java.awt.Dimension;
4   
5   import magick.CompositeOperator;
6   import magick.ImageInfo;
7   import magick.MagickException;
8   import magick.MagickImage;
9   
10  import org.slf4j.Logger;
11  import org.slf4j.LoggerFactory;
12  
13  /**
14   * 图片加水印
15   * @author wangsr 2011-9-5
16   *
17   */
18  public class JMagickWatermarkStrategy implements WatermarkStrategy {
19  	
20  	private static final Logger logger = LoggerFactory.getLogger(JMagickWatermarkStrategy.class);
21  	
22  	private static final String[] Type = { ".JPG", ".JPEG", ".BMP", ".GIF", ".PNG" };
23  	
24  	public static boolean checkType(String path) {
25  		for (int i = 0; i < Type.length; i++) {
26  			if (path.toUpperCase().endsWith(Type[i])) {
27  				return true;
28  			} else {
29  				continue;
30  			}
31  		}
32  		return false;
33  	}
34  	
35  	/**
36  	 * 创建图片水印 
37  	 * @param       srcImg    源文件路径 
38  	 * @param            targetImg       生成文件位置 
39  	 * @param            watermarkImg    水印图标 
40  	 * @author wangsr 2011-9-5 
41  	 * @throws MagickException 
42  	*/
43  	public void watermark(String srcImg, String targetImg, String watermarkImg) throws MagickException {
44  		
45  		if (!checkType(srcImg) || !checkType(targetImg) || !checkType(watermarkImg)) {
46  			return;
47  		}
48  		
49  		//Class clazz = Class.forName("magick.ImageInfo");
50  		ImageInfo info = null;
51  		MagickImage fImage = null;
52  		MagickImage sImage = null;
53  		MagickImage fLogo = null;
54  		MagickImage sLogo = null;
55  		Dimension imageDim = null;
56  		Dimension logoDim = null;
57  		try {
58  			info = new ImageInfo();
59  			//原来图片
60  			fImage = new MagickImage(new ImageInfo(srcImg));
61  			imageDim = fImage.getDimension();
62  			int width = imageDim.width;
63  			int height = imageDim.height;
64  			sImage = fImage.scaleImage(width, height);
65  			
66  			fLogo = new MagickImage(new ImageInfo(watermarkImg));
67  			logoDim = fLogo.getDimension();
68  			int lw = logoDim.width;
69  			int lh = logoDim.height;
70  			sLogo = fLogo.scaleImage(lw, lh);
71  			
72  			//开始打水印,从左上角开始;如果到右边界则重新开始一行的打印(x=0,y=y+h)
73  			int startX = 0;
74  			int startY = 0;
75  			do {
76  				sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo, startX, startY);
77  				//改变坐标,调整图片水印密度
78  				startX += (logoDim.width + 50);
79  				if (startX >= width) {
80  					startY += logoDim.height * 2;
81  					startX = 0;
82  				}
83  			} while (startY <= height);
84  			
85  			sImage.setFileName(targetImg);
86  			sImage.writeImage(info);
87  		} catch (Throwable e) {//必须捕获Throwable类型,本层有可能抛出Error
88  			logger.error("--watermark failed:"+ e.getStackTrace());
89  			throw new MagickException(e.getMessage());
90  		}finally {
91  			if (fImage != null) {
92  				fImage.destroyImages();
93  			}
94  			if (sImage != null) {
95  				sImage.destroyImages();
96  			}
97  			if (fLogo != null) {
98  				fLogo.destroyImages();
99  			}
100 			if (sLogo != null) {
101 				sLogo.destroyImages();
102 			}
103 		}
104 	}
105 	
106 	//	/**改变图片大小  
107 	//	 * @param   filePath    原图片位置  
108 	//	 *          toPath      新图片位置  
109 	//	 *          width       新图片的宽度  
110 	//	 *          height      新图片的高度  
111 	//	 * @return   
112 	//	 * @throw  
113 	//	 * @author [email protected] 2010-8-11  
114 	//	 */
115 	//	public static void imageResize(String filePath, String toPath, int width, int height) throws MagickException {
116 	//		ImageInfo info = null;
117 	//		MagickImage image = null;
118 	//		Dimension imageDim = null;
119 	//		MagickImage scaled = null;
120 	//		
121 	//		if (!checkType(filePath) || !checkType(toPath)) {
122 	//			return;
123 	//		}
124 	//		
125 	//		try {
126 	//			info = new ImageInfo();
127 	//			image = new MagickImage(info);
128 	//			imageDim = image.getDimension();
129 	//			if (width <= 0 || height <= 0) {
130 	//				height = 120;
131 	//				width = 120;
132 	//			}
133 	//			scaled = image.scaleImage(width, height);
134 	//			scaled.setFileName(toPath);
135 	//			scaled.writeImage(info);
136 	//		} finally {
137 	//			if (scaled != null) {
138 	//				scaled.destroyImages();
139 	//			}
140 	//		}
141 	//	}
142 	//	
143 	//	/**创建文字水印  
144 	//	 * @param       filePath    源文件路径  
145 	//	 *              toImg       生成文件位置  
146 	//	 *              text        水印文本  
147 	//	 *              pos         logo在源图片中的相对位置,以像素点为单位  
148 	//	 *              pointSize   用于设置点阵大小  
149 	//	 * @return   
150 	//	 * @throw   MagickException  
151 	//	 * @author [email protected] 2010-8-11  
152 	//	 */
153 	//	public static void createWaterPrintByText(String filePath, String toImg, String text, Point pos, int pointSize)
154 	//	        throws MagickException {
155 	//		if (!checkType(filePath) || !checkType(toImg)) {
156 	//			return;
157 	//		}
158 	//		
159 	//		if (null == text || "".equals(text)) {
160 	//			text = "[email protected]";
161 	//		}
162 	//		
163 	//		ImageInfo info = new ImageInfo(filePath);
164 	//		if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) {
165 	//			info.setCompression(CompressionType.JPEGCompression); // 压缩类别为JPEG格式     
166 	//			info.setPreviewType(PreviewType.JPEGPreview); // 预览格式为JPEG格式     
167 	//			info.setQuality(95);
168 	//		}
169 	//		MagickImage aImage = new MagickImage(info);
170 	//		Dimension imageDim = aImage.getDimension();
171 	//		int width = imageDim.width;
172 	//		int height = imageDim.height;
173 	//		
174 	//		if (width <= (int) pos.getX() || height <= (int) pos.getY()) {
175 	//			pos.setLocation(0, 0);
176 	//		}
177 	//		
178 	//		int a = 0;
179 	//		int b = 0;
180 	//		String[] as = text.split("");
181 	//		for (String string : as) {
182 	//			if (string.matches("[/u4E00-/u9FA5]")) {
183 	//				a++;
184 	//			}
185 	//			if (string.matches("[a-zA-Z0-9]")) {
186 	//				b++;
187 	//			}
188 	//		}
189 	//		int tl = a * 12 + b * 6;//字符长度     
190 	//		MagickImage scaled = aImage.scaleImage(width, height);
191 	//		if (width > tl && height > 5) {
192 	//			DrawInfo aInfo = new DrawInfo(info);
193 	//			aInfo.setFill(PixelPacket.queryColorDatabase("white"));
194 	//			aInfo.setUnderColor(new PixelPacket(65535, 65535, 65535, 65535));//设置为透明颜色     
195 	//			aInfo.setPointsize(pointSize);
196 	//			// 解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑     
197 	//			String fontPath = "C:/WINDOWS/Fonts/MSIMHEI.TTF";
198 	//			// String fontPath = "/usr/maindata/MSYH.TTF";     
199 	//			aInfo.setFont(fontPath);
200 	//			aInfo.setTextAntialias(true);
201 	//			aInfo.setOpacity(0);//透明度     
202 	//			aInfo.setText(text);
203 	//			aInfo.setGeometry("+" + ((int) pos.getX() + "+" + (int) pos.getY()));
204 	//			scaled.annotateImage(aInfo);
205 	//		}
206 	//		scaled.setFileName(toImg);
207 	//		scaled.writeImage(info);
208 	//		scaled.destroyImages();
209 	//	}
210 	//	
211 	//	/**切取图片  
212 	//	 * @param       imgPath     原图路径  
213 	//	 *              toPath      生成文件位置  
214 	//	 *              w           左上位置横坐标  
215 	//	 *              h           左上位置竖坐标  
216 	//	 *              x           右下位置横坐标  
217 	//	 *              y           右下位置竖坐标  
218 	//	 * @return   
219 	//	 * @throw   MagickException  
220 	//	 * @author [email protected] 2010-8-11  
221 	//	 */
222 	//	public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException {
223 	//		ImageInfo infoS = null;
224 	//		MagickImage image = null;
225 	//		MagickImage cropped = null;
226 	//		Rectangle rect = null;
227 	//		try {
228 	//			infoS = new ImageInfo(imgPath);
229 	//			image = new MagickImage(infoS);
230 	//			rect = new Rectangle(x, y, w, h);
231 	//			cropped = image.cropImage(rect);
232 	//			cropped.setFileName(toPath);
233 	//			cropped.writeImage(infoS);
234 	//			
235 	//		} finally {
236 	//			if (cropped != null) {
237 	//				cropped.destroyImages();
238 	//			}
239 	//		}
240 	//	}
241 	
242 	public static void main(String[] args) {
243 		
244 		//test for function imageResize     
245 		
246 		//      JMagicjWrapper.imageResize("pics.jpg", "reSize20x30.png", 20, 30);    
247 		//      JMagicjWrapper.imageResize("pics.jpg", "reSize250x200.jpeg", 250, 200);    
248 		//      JMagicjWrapper.imageResize("pics.jpg", "reSize50x50.jpg", 50, 50);    
249 		//      JMagicjWrapper.imageResize("pics.jpg", "reSize120x120.bmp", 120, 120);    
250 		//      JMagicjWrapper.imageResize("pics.jpg", "reSize.tif", 20, 30);//not create file     
251 		//          
252 		
253 		//test for function createWaterPrintByImg     
254 		//JMagicjWrapper.imageResize("wpl.gif", "logo250x200.gif", 250, 200);    
255 		//Because file "wpl.gif" may not be release, the later function cause a error, can not open file handle.     
256 		//JMagicjWrapper.createWaterPrintByImg("pics.jpg", "wpl.gif", "logoFull.jpg", new Point(1680,1050));//not create file     
257 		//JMagicjWrapper.createWaterPrintByImg("pics.jpg", "wpl.gif", "logoExt.jpg", new Point(2000,1000));//not create file     
258 		
259 		//test for function createWaterPrintByText     
260 		//This function can not handle Chinese Character, I'll continue to takle the issue      
261 		//JMagicjWrapper.createWaterPrintByText("pics1.jpg", "wpt.gif", "For Test", new Point(300,300), 100);    
262 		
263 		try {
264 			System.out.println(System.getProperty("java.library.path"));
265 			new JMagickWatermarkStrategy().watermark("C:\\1.jpg", "C:\\2.jpg", "C:\\watermark.gif");
266 		} catch (MagickException e) {
267 			e.printStackTrace();
268 		}
269 	}
270 }