Javaで大きな画像ファイルを読み込もうとしていますが、ファイルが大きすぎるとメモリエラーメッセージが表示されています(既にコマンドラインフラグでヒープサイズを増やしてみました)。Javaで大きな画像を読み込む方法
BufferedImage img = ImageIO.read(fileToOpen);
、ファイルがTIFFの場合は、私はこのコードを使用しています:イメージは、私はこのコードを使用していたTIFF画像ではない場合
:
私は、以下の方法で画像をロードしています:
BufferedImage img = JAI.create("fileload",
fileToOpen.getAbsolutePath()).getAsBufferedImage();
私の質問は、実際にはこれに沸く:どのようにメモリエラーを取得せずに(例えば、Photoshopのような)画像操作プログラム数百メガバイトのロードファイル?
20MBのJPEGをメモリに読み込むのが難しい理由は、BufferedImageに読み込むと、イメージを非圧縮形式で保存するなどの理由からです。したがって、可能な解決策の1つは、Imageクラスをサブクラス化して圧縮された形式でデータを格納するJavaクラスを持つことです。しかし、それはおそらくランタイムマシンが描画中にデータを解凍する必要があるため、スピードの問題があります。もう1つの選択肢は、圧縮されていない生データをディスクにキャッシュし、そこからシームレスに読み取ることですが、速度の問題は引き続き発生します。
大男たちはどうやってそれをしますか? Photoshopはどのようにメモリに200MBのJPEGをロードし、明らかな問題を起こさずに解像度をすべて引き出すことができますか?
(最後の注意:私のアプリケーションであるためスピードの問題の私は私のBufferedImageを取得した後、私は同じ寸法を持つVolatileImageにその内容を描く。これは、大幅に描画速度を向上させる)
ありがとうございました。特に設定された加速部分。誰かがより適切な(私の場合)の回答が出てくる場合は、正しい投票ボタンを予約しています –
あなたは答えを受け入れることを意味します。有益な回答を投票するのは無料で、SOの限度額ですでに投票がなくなっていない限り、すべての回答についてそれを行うことができ、予約する必要はありません。質問を洗練させるオプションもあります。おそらく私(または他の誰か)がより正確な答えを出すことができます。 – akarnokd
heheはい私はそれを意味しました。私も投票ボタンを意味した。私は答えが未回答のセクションに残って、より多くの露出のためにもう少し長くしてから投票することを望みます。私はあまりにも非倫理的ではないことを願っています:P –