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 }