java 使用im4java + imageMagick实现EMF转PNG

2023-12-27 17:17:14

一、下载 imageMagick

imageMagick 官网下载

这里以下载 window 版本为例:
在这里插入图片描述

关于Q8,Q16的说明:
Q8表示: 8-bits per pixel quantum
Q16表示:16-bits per pixel quantum
使用16-bit在处理图片时比8-bit慢15%至50%,并须要更多的内存。比如处理一张1024x768像素的图片8-bit要使用3.6M内存,16-bit要使用7.2M内存。
计算方法是: (5 * Quantum Depth * Rows * Columns) / 8
8-bit可表示0-255种值,16-bit可表示0-65535种值。默认值是8-bit。大多数电脑显示使用8-bit per pixel quantums。现代数码相机照的相片,每一种颜色就是8位深,3种颜色就是24位,选Q8的话也可以满足使用要求,同时可节省计算机资源。

这里我们选择下载官方推荐的文件,也就是第一个:
在这里插入图片描述
下载完成得到一个exe执行文件:
在这里插入图片描述
进行安装(一直点下一步即可)。
在这里插入图片描述
测试 imageMagick 是否安装成功,可以使用命令将emf文件转为png
在这里插入图片描述

二、在java中使用 im4java + imageMagick 实现转换

在maven中添加依赖

<dependency>
   <groupId>org.im4java</groupId>
    <artifactId>im4java</artifactId>
    <version>1.4.0</version>
</dependency>
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class ImageMagickConvertTest {
    //imageMagick安装位置
    final static String imageMagickLocation = "D:\\ImageMagick\\ImageMagick-7.1.1-Q16-HDRI";

    public static void main(String arg[]) throws InterruptedException, IOException, IM4JavaException {
        //需要转换的emf文件
        String inputFile = "D:\\emf\\test.emf";
        File file = new File(inputFile);
        if(!file.exists()) {
            throw new FileNotFoundException("文件不存在");
        }

        //转换为png存储的位置和名称
        String output = "D:\\emf\\";
        String currentTime = getCurrentTime();
        output += currentTime + "-png.png";

        IMOperation op = new IMOperation();
        op.addImage(inputFile);
        op.addImage(output);

        convert(op);
    }

    /**
     * 转换
     * @param op
     */
    public static void convert(IMOperation op) {
        try{
            ConvertCmd convert = new ConvertCmd();

            convert.setSearchPath(imageMagickLocation);
            convert.run(op);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private static String getCurrentTime() {
        // 获取当前时间
        LocalTime currentTime = LocalTime.now();
        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHmmss");
        // 格式化时间为字符串
        String formattedTime = currentTime.format(formatter);

        return formattedTime;
    }
}
注意事项

我用的ImageMagick版本是ImageMagick-7.1.1-24-Q16-HDRI-x64-dll.exe,安装完后发现安装目录里只有个 magick.exe 命令。程序里直接使用 convert 的时候都会报错,提示文件找不到。新版本使用这些命令必须先写上 magick 命令才行,比如这样 magick convert xxxx。原因可能是ImageMagick版本更新了,但是Im4java版本没更新(Im4java版本是1.4.0),导致出现不兼容的情况,解决办法很简单,直接把 magick.exe 复制一份,重命名为convert命令就可以了,实测可用。

在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_45956838/article/details/135245061
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。