gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:18:50 26 4
gpt4 key购买 nike

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

我正在绘制一个大图像并使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com