2012-09-01 20 views
5

Arka plan:Android Bitmap Pikselleri - doğrudan dosyaya yazmak?

Amaç, OpenGL işlenmiş verilerle oldukça büyük (en az 2048 x 2048 piksel) görüntü dosyası yazmaktır.

Bugün, 32 bit (argb8888) piksel verilerini bir int dizisine almak için glReadPixels'i kullanıyorum.

Ardından, verileri 32 bit argüman değerlerini 16 bit (rgb565) değerlerine dönüştürerek yeni bir kısa diziye kopyalarım. Bu noktada, görüntüyü baş aşağı çeviririm ve opengl-görüntü verisini android bitmap verileriyle (farklı sıra sırası ve renk kanalı sırası) uyumlu hale getirmek için renk sırasını değiştiririm.

Son olarak, bir png dosyası olarak diske kaydedebilmek için bir Bitmap() örneği ve .copyPixelsFromBuffer (Arabellek b) oluşturuyorum.

Ancak bazı telefonlarda bellek kilitlenmesini önlemek için belleği daha verimli kullanmak istiyorum.


Soru:

  1. I [] int birinci dönüşüm atlayabilir -> kısa [] bir şekilde (ve piksel verileri için yeni bir dizi dağılımını önlemek)? Belki de sadece byte dizileri/arabellekleri kullanın ve dönüştürülen pikselleri okudumla aynı diziye yazın ...

  2. Daha da önemlisi: Bitmap oluşturulmasını atlayabilir (burada programın çökmesi) ve bir şekilde verileri doğrudan çalışan bir görüntü dosyası olarak disk (ve bitmap nesnesinde tekrar piksel verilerinin ayrılmasını önlemek)?

DÜZENLEME: Ben dosyaya doğrudan veri yazabilir, belki ben dosya belleğe okunabilir dosya boyutu ve ne kadar hızlı bağlı olarak 16 bit piksel verilere dönüştürmek gerekmez daha sonra bir nokta.

+0

+1 Mükemmel bir şekilde yazılı soru için – Ridcully

cevap

3

Bunun yardımcı olabileceğinden emin değilim, ancak bu PNGJ kitaplığı sıralı olarak satır satırında bir PNG yazmayı sağlar. Birincil endişeniz varsa bellek kullanımı (ve piksel değerlerine işlenen verilerden son PNG dosyasının sırasına erişebilirseniz) yararlı olabilir.

+0

Bu gerçekten düşük bellek kullanımı. PNGJ ile o anda her bir piksel satırını okuyabiliyorum (ve evet alttan okuyabiliyorum -> üst) ve doğrudan sd kartına yazabiliyorum. Sadece bir (genişlik x 3) bayt dizisi ayırmalı ve her satır için yeniden kullanmam gerekir. Bu, daha önce yaptığım şeye kıyasla hiçbir şeye yakın değil! :) – cmbellman

İlgili konular