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);
            }
        }
    }

}

 以上希望能够帮助到大家!!

你可能感兴趣的:(windows,OS)