当前位置: 首页 > 知识库问答 >
问题:

图像大小在JAR中返回-1,但在IDE中返回适当的大小。通过Toolkit加载的图像....createImage(url)

戚建白
2023-03-14

宽度:-1

持续时间:38毫秒

宽度:32

线程“main”java.lang.IllegalArgumentException:Width(-1)和height(-1)在java.awt.image.DirectColorModel.createCompatibleWritableRaster(未知源)在java.awt.image.BufferedImage.(未知源)在imagesizeProblem.createBufferedImage(未知源)在imagesizeProblem.createBufferedImage(imagesizeProblem.java:82)在imagesizeProblem.main(

编辑:MediaTracker的“iserrorany()”返回true。但我无法找出错误所在--而且,图像确实正确加载,因为它可以通过创建ImageIcon成功地在JToolBar中使用。(我已经尝试滥用ImageIcon的getIconWidth()或getImage()方法--它们没有带来任何改进。)

SSCCE:

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

public class ImageSizeProblem {

    public static void main(final String[] args) {

        final Image img = createImageFromResource("test.png");

        System.out.println("IMAGE: " + img);
        System.out.println("WIDTH: " + img.getWidth(null));

        final long startTime = System.currentTimeMillis();
        waitForImage(img);
        final long duration = System.currentTimeMillis() - startTime;
        System.out.println("\nDURATION: " + duration + " ms");

        System.out.println("\nWIDTH: " + img.getWidth(null));

        final BufferedImage buffImg = createBufferedImageFromImage(img, false);
        System.out.println("\nBUFFEREDIMAGE: " + buffImg);

        System.exit(0);
    }

    private static Image createImageFromResource(final String resourceFileName_dontForgetToAddItsFolderToClasspath) {

        final Toolkit kit = Toolkit.getDefaultToolkit();
        final URL url = ClassLoader.getSystemResource(resourceFileName_dontForgetToAddItsFolderToClasspath);
        if (url != null) {
            final Image img = kit.createImage(url);
            if (img == null) {
                System.err.println("Image resource could not be loaded.");
                return null;
            }
            return img;
        } else {
            System.err.println("Image resource not found.");
            return null;
        }
    }

    private static boolean waitForImage(final Image img) {
        final MediaTracker mediaTracker = new MediaTracker(new JPanel());
        mediaTracker.addImage(img, 1);
        try {
            mediaTracker.waitForID(1);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        return !mediaTracker.isErrorAny();
    }


    // improved version of http://stackoverflow.com/a/13605411/3500521
    private static BufferedImage createBufferedImageFromImage(final Image img, final boolean withTransparency) {

        if (img instanceof BufferedImage) {
            return (BufferedImage) img;
        } else if (img == null) {
            return null;
        }

        final int w = img.getWidth(null);
        final int h = img.getWidth(null);

        final BufferedImage bufferedImage;
        if (withTransparency) {
            bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        } else {
            bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        }

        final Graphics2D g = bufferedImage.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return bufferedImage;
    }
}

请注意,用于测试的图像是通过JToolbar中的新ImageIcon(image)在另一个应用程序中成功加载和使用的。从ImageIcon获取大小也会返回-1,也会从ImageIcon.getimage()返回的图像返回-1。

共有1个答案

邓昊天
2023-03-14

该死的。

问题是路径深度。

我也尝试了Avira,因为技术上的问题是程序正在访问它自己的文件,这看起来很可疑,但当Avira卸载时,我尝试了不同位置的可执行文件,路径更短,一切都像魅力一样工作。

 类似资料:
  • 我正在获取功能的帖子的特色图像 之前它获取了正确的图像,但我在wordpress媒体设置中将媒体大小从300更改为400,并重新生成了所有图像。显示并生成大小为400的图像。但现在它继续获取300分辨率的图像,而不是400分辨率的图像。 如何修复此问题并使其获取400大小的图像?

  • 我有一个尺寸为800x800的图像,其大小为170 kb。我想将此图像调整为600x600。调整大小后,我希望缩小图像大小。我该怎么做?

  • 我想减少一个480 X 480位图图像大小到30 X 30像素大小,但保持整个高度和宽度完整。(我不想缩放或使用高度/宽度属性!) 让我用更简单的方式--我试图将位图图像中的像素从480 X 480减少到30 X 30,高度和宽度保持不变,并且在将图像转换为30 X 30后,我预计会有一些失真。 我做了缩放,但它减少了宽度和高度,如果我再次增加宽度和高度,它只是恢复正常的像素。谢谢!

  • 我试图创建一个GUI如下图所示 然而,当我运行我的文件时,图像的大小仍然保持原来的大小 我怎样才能缩小图像的大小,这样我就可以在旁边添加文本了?

  • 问题内容: 我正在使用Grails开发网络相册,并且用于图像处理,正在使用grails-image-tools插件。如果上传的图像太大(例如:大于600 * 840),我需要一种功能来调整图像的大小。在这种情况下,我需要将此图像调整为600 * 840)。最有效的方法是什么?非常感谢。 问题答案:

  • 我有一个< code>JPanel到< code>JFrame中。我在< code>JPanel上加载了一张图片,但它只显示了图片的一部分:这是我所做的代码部分: 这就是它的样子: 完整的图片看起来像这样: 有没有办法将图片缩放到< code>JFrame的大小?预先感谢

  • 我明白了,SyntaxError:await只在异步函数和顶级模块体中有效。但是,如果我删除了async,只打印值而不返回它,它就可以正常工作。那么我怎样才能从函数中得到返回值,并将其保存在变量中呢?

  • 我只是最近迁移一些旧的博客文章从一个网站到另一个。图像也已导入。然而,现在我的大多数图像返回404错误。 图片目前正在链接到/wp content/uploads/2018/05/image_name-800x600.jpg。我的问题是800x600是已添加的自定义图像大小。我尝试为800x600添加主题支持,然后使用“强制重新生成缩略图”WordPress插件重新生成缩略图。这似乎没有解决任何问