2012-09-01 9 views
5

背景:Androidビットマップピクセル - ファイルに直接書き込みますか?

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

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

次に、新しい短い配列にデータをコピーし、32ビットのargb値を16ビット(rgb565)値に変換します。この時点では、画像を上下逆にして色順を変えて、OpenGL画像データをAndroidのビットマップデータ(異なる行順と色順)に対応させます。

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

しかし、私はいくつかの携帯電話のメモリクラッシュを避けるために、より効率的なメモリを使いたいと思います。


質問:

  1. 私は[] int型から最初の変換をスキップすることができます - >ショート[]何らかの方法で(画素データのための新しい配列の割り当てを避けるため)?たぶんバイト配列/バッファを使用して、変換したピクセルを同じ配列に書き込んでいます。

  2. さらに重要:ビットマップの作成をスキップしてもかまいません(ここではプログラムがクラッシュします)。ディスクを作業イメージファイルとして使用します(ビットマップオブジェクト内のピクセルデータの再割り当てを避けます)。

編集:私は、ファイルに直接データを書き込むことができれば、多分私は、ファイルがでメモリに読み込むことができ、ファイルサイズとどのくらいの速に応じて、16ビットの画素データに変換する必要はありません後のポイント。

+0

+1についてよく書かれた質問 – Ridcully

答えて

3

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

+0

これは実際にメモリ使用量を減らしました。 PNGJを使用すると、その時点で各ピクセルの行を読み取ることができます(そして、私はbottom-> topを読むことができます)。それをSDカードに直接書き込むことができます。私はちょうど1つ(幅x 3)のバイト配列を割り当て、すべての行にそれを再利用する必要があります。これは私が前にしたものに比べて何も近くにありません! :) – cmbellman

関連する問題