JAVA读取EMF文件并转化为PNG,JPG,GIF格式

简介: JAVA读取EMF文件并转化为PNG,JPG,GIF格式

JAVA读取EMF文件并转化为PNG,JPG,GIF格式

使用第三方库下载地址为:http://java.freehep.org/vectorgraphics/index.html

主要思路:

使用EMFInputStream读取EMF文件,然后使用EMFRenderer对象将EMF绘制到创建


好的空白的BufferedImage里面。这样就把EMF图片转化为Java中的BufferedImage对


象,然后可以重新保存为Java 2D支持图像格式如PNG或者JPG等。

代码如下:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
import org.freehep.graphicsio.emf.EMFInputStream;
import org.freehep.graphicsio.emf.EMFRenderer;
/**
 * download the third-party libraries here:
 * http://java.freehep.org/vectorgraphics/index.html
 * 
 * @author gloomyfish
 *
 */
 
public class EMFReader {
  public static void main(String[] args) {
    try {
      EMFInputStream inputStream = new EMFInputStream(new FileInputStream("D:\\export.emf"), EMFInputStream.DEFAULT_VERSION);
      System.out.println("height = " + inputStream.readHeader().getBounds().getHeight());
      System.out.println("widht = " + inputStream.readHeader().getBounds().getWidth());
      
      // headerInfo of bitmap API always tell a lie, could not get 
      // correct width and height
      // BitmapInfoHeader headerInfo = new BitmapInfoHeader(inputStream);
      // System.out.println("Big Error on reading emf format picture");
      EMFRenderer emfRenderer = new EMFRenderer(inputStream);
      
      // create buffered image object from EMF render
        final int width = (int)inputStream.readHeader().getBounds().getWidth();
        final int height = (int)inputStream.readHeader().getBounds().getHeight();
        System.out.println("widht = " + width + " and height = " + height);
        final BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D)result.createGraphics();
        emfRenderer.paint(g2);
        
        // write it as png/jpg/gif, up to you!!!
        File outputfile = new File("D:\\result.png");
        ImageIO.write(result, "png", outputfile);
 
        // display it
        JPanel resultPanel = new JPanel() {
          /**
         * 
         */
        private static final long serialVersionUID = 1L;
 
        public void paintComponent(Graphics g) {
          super.paintChildren(g);
          Graphics2D g2 = (Graphics2D)g;
          g2.drawImage(result, 0, 0, width, height, null);
          }
        };
        JFrame ui = new JFrame("EMF Reader");
        ui.getContentPane().setLayout(new BorderLayout());
        ui.getContentPane().add(resultPanel, BorderLayout.CENTER);
        ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ui.setSize(new Dimension(width+20, height+40));
        ui.setVisible(true);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
}

相关文章
|
3天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
21 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
3天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
17 1
|
1天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
12 4
|
8天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1天前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
4天前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。
|
4天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
26 2
|
3天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
8天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
5天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。