Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们如何使用Java API将WMF/EMF(MS图元文件)转换为标准图像,如JPG或PNG?_Java_Image_Image Processing - Fatal编程技术网

我们如何使用Java API将WMF/EMF(MS图元文件)转换为标准图像,如JPG或PNG?

我们如何使用Java API将WMF/EMF(MS图元文件)转换为标准图像,如JPG或PNG?,java,image,image-processing,Java,Image,Image Processing,我一直致力于使用Java将WMF/EMF图像转换为标准图像格式,如JPG或PNG 可用的最佳选项是什么?这里有一种方法 获取(或制作)一个可以呈现相关文件的Java组件 创建一个与组件显示图像所需大小相同的buffereImage 从缓冲区图像中获取图形对象 调用renderComponent.paintComponent(图形) 使用ImageIO.write()变体之一保存图像 有关步骤2-5,请参见我对的回答。第一步。这是我想问谷歌的问题 是一个用Java处理SVG的工具包。包括一些转换器

我一直致力于使用Java将WMF/EMF图像转换为标准图像格式,如JPG或PNG

可用的最佳选项是什么?

这里有一种方法

  • 获取(或制作)一个可以呈现相关文件的Java组件
  • 创建一个与组件显示图像所需大小相同的
    buffereImage
  • 缓冲区图像
    中获取
    图形
    对象
  • 调用
    renderComponent.paintComponent(图形)
  • 使用
    ImageIO.write()
    变体之一保存图像
  • 有关步骤2-5,请参见我对的回答。第一步。这是我想问谷歌的问题

    是一个用Java处理SVG的工具包。包括一些转换器,如从WMF转换为SVG,以及将SVG转换为JPEG/PNG。有关更多详细信息,请参阅


    另一种选择是。它不是Java而是Java绑定:而且。

    wmf是一种矢量文件格式。为了获得最佳结果,请将它们转换为
    .svg
    .pdf
    格式。 我分两个阶段做

    1) wmf2fig——自动XXXX.wmf

    2) 图2PDF——nogv XXXX.fig

    我创建了一个用于批量转换的python脚本

    import subprocess as sbp
    a = sbp.Popen("ls *.wmf",shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
    filelist = a.communicate()[0].splitlines()
    
    for ele in filelist:
        cmdarg = 'wmf2fig --auto '+ ele.rsplit('.',1)[0]+'.wmf'
        a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
        out = a.communicate()
    
    for ele in filelist:
        cmdarg = 'fig2pdf --nogv '+ ele.rsplit('.',1)[0]+'.fig'
        a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
        out = a.communicate()
    
    cmdarg = 'rm *.fig'
    a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
    out = a.communicate()
    

    不久前,我围绕Batik软件包(如所述)创建了一些包装,为SVG和WMF/EMF提供了ImageIO支持

    使用这些插件,您应该能够编写:

    ImageIO.write(ImageIO.read(wmfFile), pngFile, "png");
    
    上的源代码


    虽然ImageIO插件很方便,但im4java和JMagick可能仍然有更好的格式支持。

    如果您在Windows环境中部署应用程序,则可以为您处理转换

        Image image = new Image(Display.getCurrent(), "test.wmf");                
        ImageLoader loader = new ImageLoader();
        loader.data = new ImageData[] { image.getImageData() };
        try(FileOutputStream stream = new FileOutputStream("test.png"))
        {
            loader.save(stream, SWT.IMAGE_PNG);
        }
        image.dispose();
    

    SWT的目的是围绕本机功能提供一个Java包装器,在本例中,它直接调用windows GDI,以使其呈现WMF。

    可以向我展示一段代码..以便我理解..我无法从相关文件中创建图像(Java.awt.image)。这再一次在创建BuffereImage时提出了一个问题。希望你能理解。制作WMF/EMF图像的人应该被枪杀,但这是值得的:我确信,优秀的(免费的)ImageMagick过去能够转换WMF文件。过去,ImageMagick还有一个Java包装器(如果内存可用,则称为JMagick)。所以你可能想看看里面。也就是说,据我回忆,WMF/EMF只是围绕各种格式的“外壳”或“包装器”,因此它可能是一个移动的目标,很可能有很多不同的WMF/EMF文件,我真的不确定是否仍然正确处理了这些文件。它过去是这样工作的……虽然答案不是关于Java,但我同意最好将转换后的结果保持为向量。蜡染将能够转换为SVG。