Image クラスのインスタンスである画像を表示しようとしています ( http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html)。私はそれを BufferedImage にする必要があり、その目的に適したコードを見つけました (Graphics を使用)。ただし、BufferedImage を作成するには、画像の幅と高さを知る必要があります。Image クラスには getWidth メソッドと getHeight メソッドがありますが、常に正しく機能しているようには見えません。デバッグを使用すると、幅と高さが -1 に設定されることがあることがわかりました。また、実際に getWidth メソッドと getHeight メソッドを呼び出すと、幅と高さの値が「更新」されるため、その後は高さと幅が正しい値になることもわかりました。そこで、getWidth と getHeight を「実際に」呼び出す前に偽の「image.getWidth(null)」を追加し、正しい値を取得しました。デバッグモードでステップバイステップで実行するとうまくいきますが、通常どおり実行するとうまくいきません。「Thread.sleep(5);」を追加しました。
この動作は非常に奇妙で、おそらく誰かがその睡眠のトリックなしでそれを機能させる説明や方法を持っているでしょうか?
編集:これが画像のロード方法です:
URL url = "path/to/img";
Image img = Toolkit.getDefaultToolkit().getImage(url);
私はこのコードへの読み取り専用アクセスとしましょう。これが、そこから始めて BufferedImage を取得したい理由です。
これに私が追加したのは
image.getWidth(null); // "Fake" call to force the image to update his width&height
try {
Thread.sleep(5);
} catch...
if(image.getWidth(null) != -1 && image.getHeight(null) != -1) {
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics bg = bi.getGraphics();
bg.drawImage(image, 0, 0 null);
bg.dispose();
}
スリープを削除すると、getWidth が完了するのに「時間がない」ように見えますが、一部の画像では幅/高さ = -1 のままです。次元を計算するために使用されるいくつかのメソッドは、おそらく非同期です。ImageIO.read() がよりシンプルで効果的な方法であることは理解していますが、この作業を行うための回避策を見つけたいと思います:)
それが不可能な場合は、別の方法を見つけますが、実際には大したことではありません。