Java集成GraphicsMagick实现压缩图片

市面上常用的压缩技术选型

技术

性能

可靠性

可维护性

活跃度

总分

JDK Image IO

7

1

6

2

16

ImageMagick

2

7

3

5

17

GraphicsMagick

10

8

6

5

29

结论:

  • JDK Image IO 有一个非常明显的问题是,在处理大图片时,很容易在内存中存在很多大对象而导致OOM
  • ImageMagick 性能着实不容乐观
  • GraphicsMagick 从 ImageMagick 中派生出来,在稳定性和性能上都更加优秀

  1. 首先安装GraphicsMagick.exe软件,根据提示直接Next安装即可

  1. 在项目中导入im4java依赖
        <dependency>
            <groupId>org.im4java</groupId>
            <artifactId>im4java</artifactId>
            <version>1.4.0</version>
        </dependency>
  1. 把压缩图片帮助类放到工具类中
package com.glyphbit.baiduocr;

import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

public class ImageCompressionUtils {
    /**
     * 获取图像的原始尺寸(宽度和高度)
     *
     * @param filePath 图像文件的路径
     * @return int[] 包含两个元素的数组,第一个元素是宽度,第二个元素是高度
     * @throws IOException 如果文件无法打开或读取时抛出异常
     */
    public static int[] getImgSize(String filePath) throws IOException {
        // 初始化一个长度为2的数组用于存储图像的宽度和高度
        int[] size = new int[2];

        // 使用ImageIO创建一个ImageInputStream对象,该对象可以从给定的文件路径中读取图像数据
        try (ImageInputStream input = ImageIO.createImageInputStream(new File(filePath))) {
            // 如果无法创建ImageInputStream,则抛出IOException异常
            if (input == null) {
                throw new IOException("File cannot be opened!");
            }

            // 获取能够读取输入流的所有ImageReader迭代器
            Iterator<ImageReader> readers = ImageIO.getImageReaders(input);

            // 从迭代器中获取第一个可用的ImageReader实例
            ImageReader reader = readers.next();

            try {
                // 设置ImageReader的输入源,并指示是否忽略元数据
                reader.setInput(input, true);

                // 获取最小索引处的图像宽度和高度
                int width = reader.getWidth(reader.getMinIndex());
                int height = reader.getHeight(reader.getMinIndex());

                // 将宽度和高度分别赋值给size数组的第一个和第二个元素
                size[0] = width;
                size[1] = height;
            } finally {
                // 确保在任何情况下都会调用reader.dispose()来释放资源
                reader.dispose();
            }
        }

        // 返回包含图像宽度和高度的数组
        return size;
    }


    /**
     * 根据尺寸缩放图片[等比例缩放:参数height为null,按宽度缩放比例缩放;参数width为null,按高度缩放比例缩放]
     *
     * @param imagePath 源图片路径
     * @param newPath   处理后图片路径
     * @param quality   压缩质量(0-100)数值越大,缩略图越清晰
     * @throws InterruptedException the interrupted exception
     * @throws IOException          the io exception
     * @throws IM4JavaException     the im 4 java exception
     */
    public static void zoomImage(String imagePath, String newPath, Double quality) {
        // 定义变量用于存储图像宽度和高度
        int[] targetImgSize = null;
        try {
            // 获取图像原始尺寸
            targetImgSize = getImgSize(imagePath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        int w = targetImgSize[0];
        int h = targetImgSize[1];

        IMOperation op = new IMOperation();
        op.addImage(imagePath);
        // 使用原始尺寸进行调整
        op.resize(w, h);
        if (quality != null) {
            op.quality(quality);
        }
        op.addImage(newPath);

        ConvertCmd convert = new ConvertCmd(true);
        String osName = System.getProperty("os.name").toLowerCase();

        try {
            if (osName.contains("win")) {
                // Windows下设置GraphicsMagick的安装路径
                convert.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.45-Q8");
            }
            // 执行转换操作
            convert.run(op);
        } catch (IOException | InterruptedException | IM4JavaException e) {
            e.printStackTrace();
        }
    }

}

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的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值