2012-09-01 15 views
5

Tło:Piksele bitmapowe Androida - napisz bezpośrednio do pliku?

Celem jest napisanie dość dużego (co najmniej 2048 x 2048 pikseli) obrazu z danymi renderowanymi OpenGL.

dzisiaj pierwsze użycie glReadPixels w celu uzyskania 32-bitowy (argb8888) danych pikseli do tablicy int.

Następnie kopiowania danych do nowej tablicy krótki, konwersja 32-bitowe wartości argB na 16-bitowe wartości (rgb565). W tym momencie również odwracam obraz do góry nogami i zmieniam kolejność kolorów, aby dane w formacie OpenGL były kompatybilne z danymi bitmapowymi Android (kolejność rzędu i kolejność kanałów kolorów).

Wreszcie tworzę instancję Bitmap() i .copyPixelsFromBuffer (Bufor b), aby móc zapisać ją na dysku jako plik png.

Jednak chcę używać pamięci bardziej wydajne, aby uniknąć wypadków z pamięci na niektórych telefonach.


Pytanie:

  1. mogę pominąć pierwszej transformacji z int [] -> krótki [] w jakiś sposób (i uniknąć przydział nowej tablicy dla danych pikseli)? Może po prostu użyj tablic bajtów/buforów i napisz przekonwertowane piksele na tę samą tablicę, z której czytam ...

  2. Co ważniejsze: czy mogę pominąć tworzenie mapy bitowej (tutaj następuje awaria programu) i jakoś zapisać dane bezpośrednio do dysk jako działający plik obrazu (i uniknąć ponownego przydzielenia danych piksela w obiekcie bitmapowym)?

EDIT: Jeśli mógłbym zapisać dane bezpośrednio do pliku, może nie trzeba konwertować do 16-bitowych danych pikselowych, w zależności od rozmiaru pliku i jak szybko można odczytać pliku do pamięci w późniejszy punkt.

+0

+1 dla doskonale pytanie pisemne – Ridcully

Odpowiedz

3

nie jestem pewien, że to może pomóc, ale to PNGJ biblioteka pozwala napisać PNG sekwencyjnie, wiersz po wierszu. Jeśli użycie pamięci, jeśli twoja główna troska (i możesz uzyskać dostęp do wartości pikseli w kolejności końcowego pliku PNG z renderowanych danych) może to być przydatne.

+0

To naprawdę zmniejszenie zużycia pamięci. Z PNGJ jestem w stanie odczytać każdy rząd pikseli w tym czasie (i tak, mogę odczytać bottom -> góra) i zapisać go bezpośrednio na karcie SD. Po prostu muszę przydzielić jedną tablicę bajtów (szerokość x 3) i użyć jej ponownie dla każdego wiersza. To prawie nic w porównaniu z tym, co robiłem wcześniej! :) – cmbellman

Powiązane problemy