Java 使用ImageIO将CGM转换为PNG图像

Java 使用ImageIO将CGM转换为PNG图像,java,javax.imageio,cgm,Java,Javax.imageio,Cgm,我正在尝试使用下面的函数将CGM文件转换为PNG。我不断收到NullPointerException public File convertCGMtoPNG(File cgmFile, File directoryToCreatePNG, String nameSuffix) throws IOException { File pngFile = new File(directoryToCreatePNG.get

我正在尝试使用下面的函数将CGM文件转换为PNG。我不断收到NullPointerException

public File convertCGMtoPNG(File cgmFile, File directoryToCreatePNG, 
                            String nameSuffix)  throws IOException 
{       
    File pngFile = new File(directoryToCreatePNG.getAbsolutePath() + 
                            File.separator +                         
        cgmFile.getName().substring(0,cgmFile.getName().lastIndexOf(".cgm")) +
                    "_" + nameSuffix + ".png");         
    BufferedImage image = ImageIO.read(cgmFile);
        ImageIO.write(image, "PNG", pngFile);
        return pngFile;
}
下面是我面临的例外

java.lang.IllegalArgumentException: image == null! at java.desktop/javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
    at java.desktop/javax.imageio.ImageIO.getWriter(ImageIO.java:1608)
    at java.desktop/javax.imageio.ImageIO.write(ImageIO.java:1540)
我尝试调试代码,发现ImageIO不支持CGM格式(CanDecodeInputFilter为我的CGM返回false)。关于如何将CGM转换为PNG图像的任何想法

PS:我正在使用Java11进行开发

提前谢谢

更新

根据回复,我尝试了库(将核心库和图像库添加到我的类路径)。它通过了“image==null!”错误,但现在抛出下面的错误

java.lang.IllegalArgumentException: width*height > Integer.MAX_VALUE!

at java.desktop/javax.imageio.ImageReader.getDestination(ImageReader.java:2821)
at net.sf.jcgm.imageio.plugins.cgm.CGMImageReader.read(Unknown Source)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1468)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1315)
仍在努力让它发挥作用

ImageIO.read(*…)将仅加载这些图像类型GIF、PNG、JPEG、BMP和WBMP

任何其他图像类型都将返回null而不会出错

参考:


我确实意识到这不是解决特定原始问题的方法,但它是解决问题的方法。

图像是否为空?ImageIO支持cgm文件吗?如果是,您应该能够检查一些图像属性,如高度和宽度。如果不支持CGM,您需要另一个图像读取例程。您需要使用jcgm库。您确定您的CGM文件是有效的CGM文件吗?看起来ImageIO.read应该可以工作。@Krishnom您面临的问题是,您试图渲染成对于标准的
BuffereImage
来说太大的东西。如果JCGM可以选择以较小的大小进行渲染(最好使用
ImageReadParam.setSourceRenderSize(…)
ImageReadParam.setSourceSubsampling(…)
),则应该可以。使用
ImageReadParam.setSourceRegion(..)
读取图像的一部分也可能有效。这不是问题的答案。但这仍然是一个值得注意的信息。