【问题标题】:How does Java Graphics.drawImage() work and what is the role of ImageObserverJava Graphics.drawImage() 是如何工作的,ImageObserver 的作用是什么
【发布时间】:2009-11-06 08:30:02
【问题描述】:

应该如何使用Java的drawImage()?我没有发现 JDK 文档非常即将发布。例如,所有的 drawImage 签名都需要一个 ImageObserver,但是这方面的文档对新用户不是很有帮助。

【问题讨论】:

    标签: java drawimage


    【解决方案1】:

    您可以使用Graphics.drawImage(img, x, y, null) [或类似的] 来逃脱惩罚。 ImageObserver参数是一个回调,通知你绘制操作的进度;并且只有在异步获取 Image 参数时才真正有用。

    为了更清楚,如果您使用未完全加载的图像调用 drawImage,它将:

    1. 返回 false(立即)
    2. 尽可能多地绘制Image(所有已加载)
    3. 并且,在未来的某个时间点,当更多图片可用时,拨打ImageObserver

    基本上,如果您在内存中使用Images(从文件系统加载或由您的程序构造),请不要担心ImageObserver 参数。如果您通过网络加载 Images 并且没有明确等待它们加载,则需要使用 ImageObserver 以确保“完全”绘制 Image

    【讨论】:

    • 非常感谢,这真的很有帮助。
    【解决方案2】:

    Image 对象不一定完全加载。如果在不完整的图像上调用Graphics.drawImage,它将尽可能多地绘制图像,然后在加载更多图像时提醒ImageObserver(通过调用imageUpdate)。

    ImageObserver 可以为空,在这种情况下您不会收到任何通知。如果已知图像已加载,或者已经有另一种机制进行重绘,这很常见。

    注意Component实现ImageObserver,其imageUpdate方法会在受影响的区域产生repaint

    【讨论】:

    • imageUpdate 也用于动画图像。
    【解决方案3】:

    实际上我多次使用drawImage() 总是将ImageObserver 参数设置为null。好吧,这并不意味着它没用,但我在不知道它的用途的情况下做了我需要的任何事情..

    【讨论】:

    • :-) 我也是 - 我不知道这是否会成为问题。
    【解决方案4】:

    正如其他人所暗示的,这个 API 是在假设要渲染的图像将通过网络加载时构思的。当您要求工具包加载图像时,假设它只是一个外壳,并且知道其大小和像素所需的字节仍在网络中爬行。

    在这种情况下,drawImage 在第一次调用时可能什么都不渲染。当尺寸和像素可用时,会通知 ImageObserver。对于Component implements ImageObserver,它的行为是在数据可用时重新绘制。

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 2013-07-05
      • 2013-02-13
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多