GraphicsMagick使用练习

GraphicsMagick官网地址:http://www.graphicsmagick.org/,介绍不多说网上都有,我这里只使用了它图片缩放功能,用java调用练习。

第一步:下载安装。

我下载的是:GraphicsMagick-1.3.20-Q8-win32-dll.exe,安装目录:C:\Program Files (x86)\GraphicsMagick-1.3.20-Q8。安装完毕后,安装目录自动配置到环境变量的Path中了,安装目录里有gm.exe。测试一下,gm -version,如果打印出GraphicsMagick相关信息则ok。这时就可以在命令行里使用gm命令了。

如果使用java调用报错:Caused by: java.io.IOException: CreateProcess error=2。则表示没有gm命令找不到,也就是说环境变量有可能更改了但是没有生效,我的做法是重启eclipse,运行同样程序就ok。如果还是报错,可能环境变量还是没有生效,重启电脑,又或者是安装目录压根就没有配置到环境变量Path中去,手动配置即可。

第二步:写代码。

依赖:

<dependency>
    <groupId>org.im4java</groupId>
    <artifactId>im4java</artifactId>
    <version>1.4.0</version>
</dependency>

代码:(api的使用和网上的都不大一样,网上的都是传入2个路径,这里是传入2个字节数组)

package org.zoo.hippo.utils;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.imageio.ImageIO;

import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;
import org.im4java.core.Stream2BufferedImage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 
 * @author yankai913@gmail.com
 * @date 2015-1-20
 */
public class ImageTool {

    private static final Logger logger = LoggerFactory.getLogger(ImageTool.class);

    private static String METHOD_SAMPLE = "sample";

    private static String METHOD_RESIZE = "resize";

    private static String METHOD_THUMBNAIL = "thumbnail";

    private static String METHOD_SCALE = "scale";


    private static IMOperation createIMOperation(double quality, String suffix, int width, int height,
            String method) {
        IMOperation op = new IMOperation();
        op.addImage();
        if (METHOD_SAMPLE.equals(method)) {
            op.sample(width, height);
        }
        else if (METHOD_RESIZE.equals(method)) {
            op.resize(width, height);
        }
        else if (METHOD_THUMBNAIL.equals(method)) {
            op.thumbnail(width, height);
        }
        else {
            op.scale(width, height);
        }
        op.quality(quality);
        op.addImage(new String[] { suffix + ":-" });
        return op;
    }


    public static byte[] sample(byte[] srcData, double quality, String suffix, int width, int height) {
        return scale0(srcData, quality, suffix, width, height, METHOD_SAMPLE);
    }


    public static byte[] resize(byte[] srcData, double quality, String suffix, int width, int height) {
        return scale0(srcData, quality, suffix, width, height, METHOD_RESIZE);
    }


    public static byte[] thumbnail(byte[] srcData, double quality, String suffix, int width, int height) {
        return scale0(srcData, quality, suffix, width, height, METHOD_THUMBNAIL);
    }


    public static byte[] scale(byte[] srcData, double quality, String suffix, int width, int height) {
        return scale0(srcData, quality, suffix, width, height, METHOD_SCALE);
    }


    private static byte[] scale0(byte[] srcData, double quality, String suffix, int width, int height,
            String method) {
        byte[] result = null;
        IMOperation op = createIMOperation(quality, suffix, width, height, method);
        try {
            ConvertCmd localConvertCmd = new ConvertCmd(true);
            long s = System.currentTimeMillis();
            ByteArrayInputStream bais = new ByteArrayInputStream(srcData);
            BufferedImage inputImage = ImageIO.read(bais);

            long s2 = System.currentTimeMillis();
            logger.info("inputStream ==> BufferedImage, take " + (s2 - s) + "ms");

            Stream2BufferedImage streamBuffered = new Stream2BufferedImage();
            localConvertCmd.setOutputConsumer(streamBuffered);
            localConvertCmd.run(op, new Object[] { inputImage });
            long s3 = System.currentTimeMillis();
            logger.info("do convert, take " + (s3 - s2) + "ms");

            BufferedImage outputImage = streamBuffered.getImage();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(outputImage, suffix, baos);

            long s4 = System.currentTimeMillis();
            logger.info("BufferedImage ==> outputStream, take " + (s4 - s3) + "ms");

            result = baos.toByteArray();

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return result;
    }
}

测试:

package org.zoo.hippo;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.junit.Assert;
import org.junit.Test;
import org.zoo.hippo.utils.ImageTool;


/**
 * 
 * @author yankai913@gmail.com
 * @date 2015-1-20
 */
public class ImageToolTest {

    @Test
    public void test_sample() throws Exception {
        FileInputStream fis = new FileInputStream("d:/Lighthouse.jpg");
        byte[] srcData = new byte[fis.available()];
        fis.read(srcData);
        fis.close();
        int width = 800;
        int height = 800;
        String suffix = "jpg";
        double quality = 90.0;
        byte[] dest = ImageTool.sample(srcData, quality, suffix, width, height);
        Assert.assertNotNull(dest);
        FileOutputStream fos = new  FileOutputStream("d:/Lighthouse2.jpg");
        fos.write(dest);
        fos.close();
    }
}

运行日志输出:
23:07:45.977 [main] INFO org.zoo.hippo.utils.ImageTool – inputStream ==> BufferedImage, take 104ms
23:07:46.313 [main] INFO org.zoo.hippo.utils.ImageTool – do convert, take 338ms
23:07:46.341 [main] INFO org.zoo.hippo.utils.ImageTool – BufferedImage ==> outputStream, take 28ms

到此代码完毕,感兴趣的哥们可以看下。

此条目发表在编程语言分类目录,贴了, , 标签。将固定链接加入收藏夹。