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 }