admin 管理员组

文章数量: 887836

一、什么是Imagemagick?

ImageMagick是一款免费开源的图片编辑软件。既可以通过命令行使用,也可以通过调用API来完成。本文介绍下怎么使用命令并结合代码实现对图片的一些处理。

二、下载和安装

这里以Windows为例

官网下载地址

ImageMagick – Download

这个7.0版本和6点几版本有些不同,系统环境变量都是自动配置好的,不需要手动配置。

使用 magick --version 查看是否安装成功:

三、使用

如果很多子命令不能直接使用,则可以把他们当做magick的子命令使用,如:

1、转换格式:将cat.png另存为cat.jpg     

magick cat.png cat.jpg

2、合成gif:将cat1.jpg、cat2.jpg合成cat.gif

magick cat1.jpg cat2.jpg cat.gif

3、调整图片大小:等比例放大为原来2倍

magick cat1.jpg -resize 200% cat3.jpg

4、解析psd文件:获取图层信息

D:\>magick identify test.psd
test.psd[0] PSD 2000x2000 2000x2000+0+0 8-bit sRGB 20.3131MiB 0.010u 0:00.009
test.psd[1] PSD 346x28 346x28+827+1005 8-bit sRGB 0.007u 0:00.007
test.psd[2] PSD 235x28 235x28+882+966 8-bit sRGB 0.009u 0:00.009
test.psd[3] PSD 2000x2000 2000x2000+0+0 8-bit sRGB 0.013u 0:00.012
test.psd[4] PSD 1957x1956 1957x1956+26+21 8-bit sRGB 0.015u 0:00.014
test.psd[5] PSD 761x1035 761x1035+603+467 8-bit sRGB 0.017u 0:00.017
test.psd[6] PSD 763x1039 763x1039+602+467 8-bit sRGB 0.020u 0:00.020
test.psd[7] PSD 761x1035 761x1035+603+467 8-bit sRGB 0.023u 0:00.023

更多命令可以用到时搜一下,需要程序执行命令可以参考下面代码。
在Java代码里使用ProcessBuilder执行ImageMagick命令。

public static List<PsdImageDTO> getPsdImageSequenceInfo(String filePath) {
        log.info("获取PSD文件图层信息 filePath:{}", filePath);
        List<String> commands = new ArrayList<>();
        //这两行Linus环境下不用写
        commands.add("cmd.exe");
        commands.add("/c");

        commands.add("magick");
        commands.add("identify");
        commands.add("-format");
        commands.add("%p %W %H %X %Y\\n");
        commands.add(filePath);

        ProcessBuilder builder = new ProcessBuilder();
        buildermand(commands);

        BufferedReader br = null;
        InputStream is = null;
        try {
            // 将错误输出流转移到标准输出流中,但使用Runtime不可以
            builder.redirectErrorStream(true);
            Process process = builder.start();
            int result = process.waitFor();
            if (result != 0) {
                throw new BusinessException("查询PSD文件总的图层序列信息命令执行失败");
            }

            is = process.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            String line = "";
            List<String> contents = new ArrayList<>();
            while ((line = br.readLine()) != null) {
                log.info("lineContent:{}", line);
                contents.add(line);
            }

            log.info("获取PSD文件图层信息 contents:{}", contents);
            if (CollectionUtils.isEmpty(contents)) {
                return new ArrayList<>();
            }

            List<PsdImageDTO> psdImageDtos = new ArrayList<>();
            for (int i = 0; i < contents.size(); i++) {
                String[] s = contents.get(i).split(" ");
                PsdImageDTO imageDto = new PsdImageDTO();
                imageDto.setIndex(s[0]);
                imageDto.setWidth(s[1]);
                imageDto.setHeight(s[2]);
                imageDto.setCoordinateX(s[3]);
                imageDto.setCoordinateY(s[4]);
                psdImageDtos.add(imageDto);
            }
            return psdImageDtos;
        } catch (Exception e) {
            log.error("getPsdImageSequenceInfo error, e:{}", e.getMessage());
            if (e instanceof BusinessException) {
                throw (BusinessException) e;
            }
            throw new BusinessException("查询PSD文件总的图层序列信息命令执行方法异常");
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

本文标签: 系统安装 imageMagick Windows