6

バックグラウンド:

目標は、OpenGL でレンダリングされたデータを使用して、かなり大きな (少なくとも 2048 x 2048 ピクセル) 画像ファイルを書き込むことです。

今日、最初に glReadPixels を使用して、32 ビット (argb8888) のピクセル データを int 配列に取得します。

次に、データを新しい short 配列にコピーし、32 ビットの argb 値を 16 ビット (rgb565) の値に変換します。この時点で、画像を上下逆にし、色の順序を変更して、opengl-image データが Android ビットマップ データと互換性を持つようにします (行の順序とカラー チャネルの順序が異なります)。

最後に、Bitmap() インスタンスと .copyPixelsFromBuffer(Buffer b) を作成して、png ファイルとしてディスクに保存できるようにします。

ただし、一部の電話でメモリ不足によるクラッシュを回避するために、メモリをより効率的に使用したいと考えています。


質問:

  1. int[] -> short[] からの最初の変換を何らかの方法でスキップできますか (そして、ピクセル データの新しい配列の割り当てを回避できますか)? たぶん、バイト配列/バッファを使用して、変換されたピクセルを私が読んだのと同じ配列に書き込んでください...

  2. さらに重要: ビットマップの作成をスキップして (ここでプログラムがクラッシュします)、何らかの方法でデータを作業イメージ ファイルとしてディスクに直接書き込むことができますか (そして、ビットマップ オブジェクトにピクセル データが再度割り当てられるのを回避できますか)。

編集:データをファイルに直接書き込むことができれば、ファイルサイズと後でファイルをメモリに読み込む速度によっては、16ビットピクセルデータに変換する必要がないかもしれません。

4

1 に答える 1

3

これが役立つかどうかはわかりませんが、このPNGJライブラリを使用すると、PNG を 1 行ずつ順番に書き込むことができます。メモリ使用量が主な関心事である場合 (および、レンダリングされたデータから最終的な PNG ファイルの順序でピクセル値にアクセスできる場合)、それは役立つ可能性があります。

于 2012-09-05T21:02:44.760 に答える