【问题标题】:Image getWidth and getHeight returning -1 inappropriately图像 getWidth 和 getHeight 不恰当地返回 -1
【发布时间】:2017-11-15 20:43:13
【问题描述】:

为什么会这样:

URL url = MinecraftPlatformGame.class.getResource("images/diamondPick.png");
image = Toolkit.getDefaultToolkit().getImage(url); 
int width = image.getWidth(null);
int height = image.getHeight(null);
System.out.println(width);
System.out.println(height);

widthheight 返回-1

编辑:在我想出答案之前我的问题实际上是我应该如何解决它。 我通过执行以下操作修复了它:

URL url = MinecraftPlatformGame.class.getResource("images/diamondPick.png");
image = Toolkit.getDefaultToolkit().getImage(url); 
MediaTracker mTracker = new MediaTracker(this);
  mTracker.addImage(image,1);
        try {
            mTracker.waitForID(1);
        } catch (InterruptedException ex) {
            Logger.getLogger(MinecraftPlatformGame.class.getName()).log(Level.SEVERE, null, ex);
        }
int width = image.getWidth(null);
int height = image.getHeight(null);
System.out.println(width);
System.out.println(height);

url = MinecraftPlatformGame.class.getResource("images/gui.png");
image1 = Toolkit.getDefaultToolkit().getImage(url);
  mTracker.addImage(image1,2);
        try {
            mTracker.waitForID(2);
        } catch (InterruptedException ex) {
            Logger.getLogger(MinecraftPlatformGame.class.getName()).log(Level.SEVERE, null, ex);
        }
        width = image1.getWidth(null);
height = image1.getHeight(null);
System.out.println(width);
System.out.println(height);

我现在遇到的问题是这似乎不是很有效,而且我似乎不需要这么多代码来导入两个图像并给定尺寸。有没有更好、更有效、更简单的方法来做到这一点?

【问题讨论】:

    标签: java


    【解决方案1】:

    根据 Javadoc:

    如果宽度未知,此方法返回 -1 并且 指定的 ImageObserver 对象稍后通知。

    响应您的编辑并遵循 Russell 的评论,请改用 ImageIO.read() 来获取完整加载的图像。

    【讨论】:

    • 另一种方法是 ImageIO.read(),它总是返回一个完全加载的图像。
    • 好的,我用 mediatracker 更新了我的问题,它现在返回正确的宽度和高度,但考虑到这仅适用于两张图像,但似乎效率低下,但还会有更多。我假设有一种更好的方法可以将照片作为资源导入并以更好的方式获取宽度和高度。 @RussellZahniser
    • 您只需要image = ImageIO.read(url)。那么image.getWidth() 从一开始就是正确的,不需要 MediaTracker。
    • @RussellZahniser 好的,你所说的工作方式,虽然我不得不用 try and catch 块包围它。
    • 一个简单的方法是创建一个新的BufferedImage 两倍大,用createGraphics() 获取它的Graphics2D,然后将原始图像绘制到其中,大小加倍。您可以通过在Graphics2D 上设置KEY_INTERPOLATION 渲染提示来控制缩放算法。如果您正在处理大量图像,则在处理完该图像后,dispose() 每个Graphics2D 都会有所帮助。
    猜你喜欢
    • 2011-09-02
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多