蓝枫一泊 发表于 2013-1-28 18:11:02

GraphicsMagick+im4j图片处理

最近研究了下windows下使用ImageMagick和GraphicsMagick+im4j处理图片,发现convert命令与系统中命令相冲突,网上有很多的资料都讲的不是很详细,总结了下分享给大家.
 
im4j包和GraphicsMagick在windows下的安装文件最下面提供下载。
 
GraphicsMagick在windows下使用:
 
public static void cropImage(String srcPath, String desPath, int sw, int sh,int dw, int dh) throws Exception {if (sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0)return;IMOperation op = new IMOperation();op.addImage();if ((sw <= dw) && (sh <= dh))// 如果源图宽度和高度都小于目标宽高,则仅仅压缩图片{op.resize(sw, sh);}if ((sw <= dw) && (sh > dh))// 如果源图宽度小于目标宽度,并且源图高度大于目标高度{op.resize(sw, sh); // 压缩图片op.append().crop(sw, dh, 0, (sh - dh) / 2);// 切割图片}if ((sw > dw) && (sh <= dh))// 如果源宽度大于目标宽度,并且源高度小于目标高度{op.resize(sw, sh);op.append().crop(dw, sh, (sw - dw) / 2, 0);}if (sw > dw && sh > dh) // 如果源图宽、高都大于目标宽高{float ratiow = (float) dw / sw; // 宽度压缩比float ratioh = (float) dh / sh; // 高度压缩比if (ratiow >= ratioh) // 宽度压缩比小(等)于高度压缩比(是宽小于高的图片){int ch = (int) (ratiow * sh); // 压缩后的图片高度op.resize(dw, ch); // 按目标宽度压缩图片op.append().crop(dw, dh, 0, (ch > dh) ? ((ch - dh) / 2) : 0); // 根据高度居中切割压缩后的图片} else // (宽大于高的图片){int cw = (int) (ratioh * sw); // 压缩后的图片宽度op.resize(cw, dh); // 按计算的宽度进行压缩op.append().crop(dw, dh, (cw > dw) ? ((cw - dw) / 2) : 0, 0); // 根据宽度居中切割压缩后的图片}}op.addImage();ConvertCmd convert = new ConvertCmd(true);convert.run(op, srcPath, desPath);// BufferedImage or String} 
ConvertCmd convert = new ConvertCmd(true)这里就与系统命令发生了冲突,改为ConvertCmd convert = new ForWinConvertCmd(true)冲突消失。
 
public class ForWinConvertCmd extends ConvertCmd {    public ForWinConvertCmd() {      super();      this.initForWin();    }    public ForWinConvertCmd(boolean useGM) {      super(useGM);      this.initForWin();    }    @SuppressWarnings("unchecked")    protected void initForWin() {      if (System.getProperty("os.name").startsWith("Windows")) {            try {                Field field = this.getClass().getSuperclass().getSuperclass()                        .getDeclaredField("iCommands");                field.setAccessible(true);                List<String> value = (List<String>) field.get(this);                value.addAll(0, Arrays.asList(new String[]{"cmd","/C"}));            } catch (Exception e) {                throw new RuntimeException(e);            }      }    }} 以上希望能够帮助到大家!!
页: [1]
查看完整版本: GraphicsMagick+im4j图片处理