GraphicsMagick的简单介绍、安装及结合im4java实现图片的压缩、裁剪、文字水印、格式转换功能(流形式)

一、GraphicsMagick的简单介绍

​ GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88中图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。
​ GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,但是现在他变得更稳定和优秀,GM更小更容易安装、GM更有效率、GM的手册非常丰富GraphicsMagick的命令与ImageMagick基本是一样的。

二、GraphicsMagick的安装

1、官网地址

官网地址

2、下载地址

下载地址
在这里插入图片描述在这里插入图片描述

3、安装

双击安装包开始安装,一直下一步即可!!!!

在这里插入图片描述

验证GraphicsMagick是否安装成功呢?

gm convert 源文件名称 目标文件名称

示例:

gm convert A1.tif B1.jpg

在这里插入图片描述

三、结合im4java使用

1、引入包

<!-- https://mvnrepository.com/artifact/org.im4java/im4java -->
<dependency>
  <groupId>org.im4java</groupId>
  <artifactId>im4java</artifactId>
  <version>1.4.0</version>
</dependency>

2、工具类(流形式)

package com.zjhang.util;

import org.im4java.core.*;
import org.im4java.process.Pipe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName GraphicsMagicTest
 * @Description 图片处理工具GraphicsMagic功能工具类(流形式)
 * @Author zhengjh
 * @Date 2021/1/14 9:29
 * @Version 1.0
 **/
public class GraphicsMagicUtil {
    // 日志
    private static Logger logger = LoggerFactory.getLogger(GraphicsMagicUtil.class);

    // GraphicsMagic的安装路径
    private static final String BIN_PATH = "E:\\Program Files\\GraphicsMagick-1.3.36-Q16";


    /**
     * 压缩图片
     *
     * @param sourceInputStream 源文件流
     * @param imageType         图片类型
     * @param width             压缩宽度
     * @param height            压缩高度
     * @return
     */
    public static byte[] compressImage(InputStream sourceInputStream, String imageType, double width, double height) {
        try {
            Map<String, String> optionsMap = new HashMap<>();
            String widHeight = width + "x" + height;
            optionsMap.put("-scale", widHeight);// 按照给定比例缩放图片
            optionsMap.put("-gravity", "center"); // 缩放参考位置 对图像进行定位
            optionsMap.put("-extent", width + "x" + height); // 限制JPEG文件的最大尺寸
            optionsMap.put("+profile", "*");// 去除Exif信息

            return getByte(sourceInputStream, imageType, optionsMap);
        } catch (Exception e) {
            logger.info("压缩图片失败:{}", e.getMessage());
            return null;
        }
    }


    /**
     * 根据坐标裁剪图片
     *
     * @param sourceInputStream 源图片流
     * @param imageType         图片类型
     * @param x                 起始横坐标
     * @param y                 起始纵坐标
     * @param x1                结束横坐标
     * @param y1                结束纵坐标
     * @return
     */
    public static byte[] cutImage(InputStream sourceInputStream, String imageType, int x, int y, int x1, int y1) {
        try {
            int width = x1 - x;
            int height = y1 - y;
            Map<String, String> optionsMap = new HashMap<>();
            String resize = width + "x" + height + "^";
            String crop = width + "x" + height + "+" + x + "+" + y;
            optionsMap.put("-resize", resize); // 图片裁剪为宽度不超过(width)px,高度不超过(height)px的缩略图
            optionsMap.put("-crop", crop); // 严格裁剪生成大小为 (width)x(height)
            optionsMap.put("-gravity", "center"); // 缩放参考位置 对图像进行定位
            optionsMap.put("+profile", "*");// 去除Exif信息

            return getByte(sourceInputStream, imageType, optionsMap);
        } catch (Exception e) {
            logger.info("根据坐标裁剪图片失败:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 图片格式转换
     *
     * @param sourceInputStream 源文件流
     * @param toFormatImageType 转换后的图片格式
     * @param optionsMap        图片处理参数(质量等)
     * @return
     */
    private static byte[] convertFormat(InputStream sourceInputStream, String toFormatImageType, Map<String, String> optionsMap) {
        try {
            return getByte(sourceInputStream, toFormatImageType, optionsMap);
        } catch (Exception e) {
            logger.info("图片格式转换失败:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 添加文字水印
     *
     * @param sourceInputStream 源图片文件流
     * @param imageType         图片格式
     * @param waterText         水印文字内容
     * @return
     * @throws Exception
     */
    public static byte[] addImgText(InputStream sourceInputStream, String imageType, String waterText) {
        try {
            Map<String, String> optionsMap = new HashMap<>();

            waterText = "text 100,100 '" + waterText + "'";
            optionsMap.put("-font", "宋体"); // 添加水印字体
            optionsMap.put("-pointsize", "30"); // 水印文字大小
            optionsMap.put("-fill", "#BCBFC8");// 水印文字颜色
            optionsMap.put("-draw", waterText);// 水印文字内容

            return getByte(sourceInputStream, imageType, optionsMap);
        } catch (Exception e) {
            logger.info("添加文字水印:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 获取处理之后的图片二进制流
     *
     * @param sourceInputStream
     * @param imageType
     * @param optionsMap
     * @return
     * @throws InterruptedException
     * @throws IOException
     * @throws IM4JavaException
     */
    public static byte[] getByte(InputStream sourceInputStream, String imageType, Map<String, String> optionsMap) throws InterruptedException, IOException, IM4JavaException {
        IMOperation imOperation = buildIMOperation(imageType, optionsMap);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        Pipe pipeIn = new Pipe(sourceInputStream, null);
        Pipe pipeOut = new Pipe(null, byteArrayOutputStream);

        ImageCommand convertCmd = getImageCommand(CommandType.convert);
        convertCmd.setInputProvider(pipeIn);
        convertCmd.setOutputConsumer(pipeOut);

        convertCmd.run(imOperation);

        return byteArrayOutputStream.toByteArray();
    }

    /**
     * 创建 IMOperation
     *
     * @param imageType  图片类型,示例:jpg、png等
     * @param optionsMap 图片处理参数
     * @return
     */
    private static IMOperation buildIMOperation(String imageType, Map<String, String> optionsMap) {
        IMOperation imOperation = new IMOperation();

        imOperation.addImage("-");

        if (optionsMap != null && !optionsMap.isEmpty()) {
            for (Map.Entry<String, String> entry : optionsMap.entrySet()) {
                imOperation.addRawArgs(entry.getKey(), entry.getValue());
            }
        }

        imOperation.addImage(imageType + ":-");

        return imOperation;
    }

    /**
     * 获取 ImageCommand
     *
     * @param command 命令类型
     * @return
     */
    private static ImageCommand getImageCommand(CommandType command) {
        ImageCommand cmd = null;
        switch (command) {
            case convert:
                cmd = new ConvertCmd(true);
                break;
            case identify:
                cmd = new IdentifyCmd(true);
                break;
            case compositecmd:
                cmd = new CompositeCmd(true);
                break;
        }

        cmd.setSearchPath(BIN_PATH);

        return cmd;
    }

    /**
     * 定义命令类型内部类
     */
    private enum CommandType {
        convert("转换处理"),
        identify("图片信息"),
        compositecmd("图片合成");

        private String name;

        CommandType(String name) {
            this.name = name;
        }
    }

    /**
     * 测试
     *
     * @param args
     * @throws FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException {
        // TODO 自行进行测试
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。 通过使用OpenMP可是利用多线程进行图片处理,增强了通过扩展CPU提高处理能力。 GraphicsMagick可以在绝大多数的平台上使用,Linux、Mac、Windows都没有问题。 GraphicsMagick 支持大图片的处理,并且已经做过GB级别的图像处理实验。GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用。事实上,GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,但是现在他变得更稳定和优秀,下面就是两个之间的一些比较。 GM更有效率(测评),能更快的完成处理工作 GM更小更容易安装 GM已经被Flickr和Etsy使用,每天处理百万计的图片 GM与已经安装的软件不会发生冲突 GM几乎没有安全问题 GM的手册非常丰富 im4java是ImageMagick的一个Java开源接口,使用起来非常方便。 很多网站都会用到对图片的一些处理,包括图片裁剪、给图片水印、按比例缩放图片等操作,用ImageMagick实现这些功能,性能非常好,图片还不会失真. 本文档详细的介绍GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值