java - 如何判断 Graphics.drawImage() 何时实际完成

标签 java image awt java-2d

这是我第一次在这里提问,我希望能得到对我有帮助的答案或想法。

我正在绘制一个大图像并使用drawImage()将其缩小。然后,我立即使用 drawImage() 绘制另一张图像,我希望将其绘制在前一张图像(第二张)之上。问题是,drawImage 会立即返回,即使缩放和渲染第一个图像需要大约 50 毫秒。大多数情况下,第二个图像最终位于第一个图像的下方,因为它是在处理第一个大图像时先绘制的。基本上是否有强制 drawImage() 阻塞直到完成,或者以某种方式检查它何时完成?

我知道 ImageObserver 参数,当从互联网或其他东西下载图像时,它工作得很好,但是当使用已经加载的 BufferedImage 时,它​​永远不会在缩放和绘制后触发 ImageUpdate() 。基本上,由于第一个图像已经“加载”,它永远不会联系 ImageObserver,它只需要大约 50 毫秒在它自己的线程中进行处理,并且从不通知它何时完成。

有谁知道如何强制它阻止或等到它完全完成缩放和位图传输图像?显然,使用 Thread.sleep(xx) 完全是一种黑客行为,并且由于计算机速度之间的差异而不可行。所有这些渲染都发生在 Paint(Graphics g) 方法内的事件线程上。

谢谢!

编辑:以下是我目前必须让您了解该问题的代码:

public void paint(Graphics window)
{
    window.setColor(Color.WHITE);
    window.fillRect(0, 0, Settings.width * Settings.aaFactor, Settings.height * Settings.aaFactor);

    Graphics2D window2D = (Graphics2D) window;
    window2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    window2D.drawImage(this.image, 0, 0, Settings.width, Settings.height, null);

    try
    {
        Thread.sleep(50);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    window2D.drawImage(this.image2, 0, 0, null);

    repaint();
}

编辑2:为了更好地解释我正在讨论的问题,我制作了一些示例代码,可以更好地解释我想要解释的内容。运行它,您会看到它闪烁,有时第一个图像位于底部(就像它应该的那样),但大多数时候它会在顶部(第二个),这是错误的。只需将文件路径更改为小图像和大图像即可。

public class Main extends Applet implements ImageObserver
{
    private BufferedImage imageA;
    private BufferedImage imageB;

    @Override
    public void init()
    {
        try
        {
            this.imageA = ImageIO.read(new File("C:\\LargeImage.jpg"));
            this.imageB = ImageIO.read(new File("C:\\SmallImage.jpg"));
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    @Override
    public void update(Graphics g)
    {
        paint(g);
    }

    @Override
    public void paint(Graphics g)
    {
        Graphics2D w = (Graphics2D) g;
        w.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        w.drawImage(this.imageA, 0, 0, 50, 50, this);// This takes a while to do (scaling down and drawing)...
        w.drawImage(this.imageB, 10, 10, null);// While this is drawn quickly, before A is done.

        repaint();
    }

    @Override
    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
    {
        System.out.println("ImageObserver fired, done drawing image.  NEVER CALLED!");
        return false;
    }
}

最佳答案

drawImage 的最后一个参数(传递 null)是一个 ImageObserver。如果您提供自己的该接口(interface)的实现 ( see JavaDoc ),您将在实际绘制图像时收到通知。

关于java - 如何判断 Graphics.drawImage() 何时实际完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532757/

相关文章:

java - 按花色对一副纸牌进行排序然后排名

java - MongoDB 的 JMX 注册错误

html - 使用一张图片作为菜单

java - 在Java中画一 strip 箭头的线

java - 在 TextArea Java 中移动文本光标

java - 当从启动类之外的 ArrayList<Area> 访问区域的边界时,接收到的矩形不正确

来自另一个线程的 JavaFX webengine.executeScript()。

java - 使用spark和java在cassandra中保存对象

php - 使用 PHP 和 MySQL 缓存调整大小的图像的最佳方法

php - 当 LAMP 服务器上有数百万用户时,存储和获取图像的最快、最有效的方法是什么?