【问题标题】:IllegalArgumentException from drawImage in Graphics2D on WindowsWindows 上 Graphics2D 中 drawImage 的 IllegalArgumentException
【发布时间】:2014-07-25 17:30:42
【问题描述】:

我在 Windows 上遇到以下错误(但在 OSX 上没有):

Exception in thread "Engine" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    at sun.java2d.pipe.DrawImage.renderImageXform(Unknown Source)
    at sun.java2d.d3d.D3DDrawImage.renderImageXform(Unknown Source)
    at sun.java2d.pipe.DrawImage.transformImage(Unknown Source)
    at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
    at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
    at sun.java2d.pipe.ValidatePipe.scaleImage(Unknown Source)
    at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
    at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
    at simpleEngine.graphics.GameGraphics.drawGameObject(GameGraphics.java:27)

使用以下代码:

public void drawGameObject(GameObject obj, BufferedImage image) {
    graphics2d.rotate(obj.getRotation(), obj.getX() + obj.getWidth()/2, obj.getY() + obj.getHeight()/2);
    graphics2d.drawImage(image, (int) obj.getX(), (int) obj.getY(), (int) obj.getWidth(), (int) obj.getHeight(), null);
    graphics2d.rotate(-obj.getRotation(), obj.getX() + obj.getWidth()/2, obj.getY() + obj.getHeight()/2);
}

GameObject 是在空间中表示的对象。它具有字段位置(双倍 x 和 y)、大小(双倍宽度和高度)和旋转(双倍弧度)以及上述字段的 getter 和 setter。

我不明白零高度和宽度的来源。在本例中,obj 的宽度和高度为 30,图像的宽度和高度为 535。

我们将不胜感激!

提前致谢!

编辑: 启动类时提供对 Graphics2D 对象的引用。此方法来自的类是 Graphics2D 的包装器,其方法简化了我的项目中的工作。当我检索 Graphics2D 时,我将它包装在这个类中并传递它。 (感谢 MadProgrammer 指出丢失的信息!)

我发现如果从 drawGameObject 中删除旋转代码,问题就解决了。它不会兑现,但不会旋转精灵。

我发现旋转是一个 NaN 并导致了问题。仍然不知道为什么它没有在 OS X 上抱怨..

【问题讨论】:

  • Graphics2D 的引用从何而来?
  • 我编辑了问题来回答您的问题,因为我认为更多人可以使用该信息来回答问题。
  • 如果您使用来自基于 JComponent 的 Componet 的 getGraphics,请不要使用。 To 不是绘画的方式。如果图形来自类似 BufferedStrategy 之类的东西,则应在每个绘制周期对其进行验证和更改
  • 我确实从 BufferStrategy 中检索每个绘制周期的 Graphics2D。奇怪的是它在 OS X 上完美运行,但在 Windows 7 上崩溃。
  • 如果没有可运行的示例来演示您的问题,就无法诊断您的问题

标签: java graphics


【解决方案1】:

如果你真的像你写的那样使用你的陈述,那么错误就在最后一行:

graphics2d.rotate(obj.getRotation(), obj.getX() + obj.getWidth()/2, obj.getY() + obj.getHeight()/2);

你写了-obj.getRotation()

【讨论】:

  • 感谢您的帮助!我很感激!但是我使用负旋转将图形旋转回正常位置,并且按预期工作。我发现问题在于旋转是NaN。我写了一个关于它的答案,但可以先在两个小时内选择它作为正确的答案。
【解决方案2】:

我发现旋转是一个 NaN 并且在使用它旋转图形时会导致问题。仍然不知道为什么它没有在 OS X 上抱怨..

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2012-09-11
    • 2018-04-05
    • 2020-07-21
    相关资源
    最近更新 更多