java - 如何解决java.lang.IllegalArgumentException : Width (-1) and height (-1) cannot be <= 0?

标签 java bufferedimage illegalargumentexception

我最近几个小时一直在尝试解决下面的堆栈跟踪问题。通过对这里的 SO 以及通过 Google 进行的主要研究,我明白异常可能意味着几件事:

  • 程序在提供的路径下找不到请求的图片;

  • 图像在生成宽度和高度后被渲染,为什么它等于0...

我错过了什么吗?我不知道如何解决这个...

堆栈

Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0 at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016) at java.awt.image.BufferedImage.(BufferedImage.java:331) at tp6.Interface.toBufferedImage(Interface.java:157) at tp6.Interface.(Interface.java:36) at tp6.Interface.main(Interface.java:171)

tp6.Interface.toBufferedImage(Interface.java:157):

public BufferedImage toBufferedImage(Image image) {

        if( image instanceof BufferedImage ) {

                return( (BufferedImage)image );
        } else {

                image = new ImageIcon(image).getImage();

                BufferedImage bufferedImage = new BufferedImage(
                                                      image.getWidth(null),
                                                      image.getHeight(null),
                                                      BufferedImage.TYPE_INT_RGB );
                Graphics g = bufferedImage.createGraphics();
                g.drawImage(image,0,0,null);
                g.dispose();
                return( bufferedImage );
        }
}

tp6.Interface.(Interface.java:36)

//IMAGE JPANEL
Image map=new ImageIcon("images/main.gif").getImage();
    Image digi=new ImageIcon("images/digits.gif").getImage();
    BufferedImage mapmodifiable= toBufferedImage(map);
    BufferedImage digits= toBufferedImage(digi);

tp6.Interface.main(Interface.java:171)

public static void main(String[] args)
    {
        Window windowintro = new Window( 440, 400, 1);
        //INTERFACE GRAPHIC
        Interface graphic=new Interface();

        graphic.addWindowListener(new WindowAdapter() {
                        @Override
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
    }

最佳答案

异常的原因已经解释过了,Image方法getWidth(null)getHeight(null)都返回了 -1 当图像尺寸(还)未知时。这是这样实现的,因为 Java 中旧的 Image API 是异步 并从当前线程加载图像资源。在您撰写时,也可能因为找不到图像而发生这种情况。

但是,当您想将图像用作 BufferedImage 时(可能是因为您想在某个阶段修改它们),使用更新的 加载它们会更好也更容易同步 ImageIO API。大多数情况下,代码会更清晰易懂,更重要的是;如果无法找到/加载图像,您会立即收到错误消息。

所以,而不是:

Image map = new ImageIcon("images/main.gif").getImage();
BufferedImage mapmodifiable = toBufferedImage(map);

你可以简单地做:

BufferedImage mapmodifiable = ImageIO.read(new File("images/main.gif"));

PS:可以将 Image 转换为 BufferedImage,就像您在 toBufferedImage 方法中所做的那样,并使用 ImageIcon.getImage(..) 应该确保图像已预加载(ImageIcon 内部使用 MediaTracker用于预加载)。但是,正如我上面所说,旧的 Image API 在错误反馈方面不是很好,所以问题很可能是找不到您的图像。

关于java - 如何解决java.lang.IllegalArgumentException : Width (-1) and height (-1) cannot be <= 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34867713/

相关文章:

Java:从缓冲图像中获取 RGBA 作为整数数组

java - List.addAll() 什么时候抛出 IllegalStateException?

java - Google App Engine 数据存储区-主键

java - eclipse eclemma - 未找到包含 : osgi. bundle,org.eclipse.eclemma 的存储库

java - 旋转 BufferedImage 中的图 block

java - BufferedImage 闪烁问题

java - Axis2 生成的 stub 是线程安全的吗?

java - 文件过滤器未出现在 Java swing 中的 JFileChooser 上

struts2 - 由 : java. lang.IllegalArgumentException 引起:未知的保留 key '_typeConverter'

jsf - 加载页面时 JSF View 的 IllegalArgumentException