1

生成された画像を Java デスクトップ アプリケーションにロードする必要があります。

私はこれよりも同様のコードを使用しています:

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}

画像は読み込まれますが、より大きな画像ではアプリケーションが終了します。

ロードできるイメージのサイズを検出するにはどうすればよいですか?

4

3 に答える 3

1

ロードできるイメージのサイズを検出するにはどうすればよいですか?

ヘッダーを読み取ることで画像の幅×高さと色深度を判断できるライブラリがあるかもしれませんが、J2SE にはすぐに使用できるものはありません。

「別の方向からの」別のアプローチは、それらをロードするために防御的なアプローチを取ることです。この手法は、この回答のコードで概説されていますが、次のように要約できます。

  • メモリーのバッファーを予約する
  • 事前にメモリ警告パネルを用意する
  • 「メモリ集約型」タスクを実行する
  • on OutOfMemoryError: バッファをクリアして、VM にメモリの「呼吸スペース」を提供します。
  • ユーザーに問題の原因とその修正方法を伝える
于 2012-09-08T22:49:04.130 に答える
1

イベント ディスパッチャー スレッドにいない場合 (UI のボタンが押されたときなど)、アプリはクラッシュしません。割り当てが解除されるスレッドがクラッシュし、画像は取得されませんが、アプリは有効になります。

Thread を作成する可能性があります。または、Thread を拡張して run() メソッドをオーバーライドするか、Runnable インターフェイスを作成してそれをスレッド コンストラクターに渡します。

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}catch(OutOfMemoryError err){
// your code will be here :)
}

画像の読み込み関数に入る前に、コードをデバッグ/ログに記録して、割り当て可能な最大メモリ量を確認してください。

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

50 MB の空き容量があり、ファイルが 50 MB の場合、ロードを試みる理由はありません。

于 2012-09-08T23:08:39.357 に答える
0

Java プログラムには、使用できるメモリの最大量があります。最大サイズは約128MBだと思います。

これがお役に立てば幸いです!

于 2012-09-08T20:34:51.810 に答える