最近研究了下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); } } } }
以上希望能够帮助到大家!!