2011-12-28 11 views
6

Od eksperymentów i od czytania innych postów like this one wydaje się, że ciężko jest przetwarzać obrazy o wysokiej rozdzielczości na Androidzie, ponieważ istnieje limit ilości pamięci, którą maszyna wirtualna może przydzielić.Obrazowanie w wysokiej rozdzielczości z Androidem

Ładowanie obrazów z kamery 8MP zajmuje około 20 MB pamięci.

Rozumiem, że łatwym rozwiązaniem jest zmniejszenie liczby obrazów podczas ładowania (BitmapFactory oferuje taką opcję), ale nadal chciałbym przetworzyć obraz w pełnej rozdzielczości: aparat robi 8MP, dlaczego miałbym używać tylko 4MP i obniżyć jakość.

Czy ktoś zna dobre obejścia tego problemu?

Odpowiedz

1

2 rzeczy:

  1. Zamówienie galeria w plaster miodu. Wykonuje to rendering oparty na kaflach. Możesz powiększyć obraz, a zobaczysz, że obecna część ma wyższą rozdzielczość niż pozostałe części. Jeśli się rozglądasz, widzisz, jak się wyświetla.

  2. Podczas korzystania z natywnego kodu (NDK) nie ma limitu zasobów. Więc możesz spróbować załadować wszystkie dane natywne i jakoś uzyskać części z nich za pomocą JNI, ale wątpię, że jest to lepsze niż galeria honeycom.

+0

Odnośnie 1. BitmapFactory jest rzeczywiście zaprojektowany do robienia rzeczy takich jak to: ładowanie tylko regionu, ładowanie w niższej rozdzielczości. Ładowanie regionów może być pomocne w uzyskaniu płytki, jak sugeruje @ paul-sasik. – Kamchatka

+0

Odnośnie 2. te same ograniczenia dotyczą kodu natywnego. Dostaję się z natywnymi błędami OutOfMemory renderującymi różne rzeczy. –

2

W środowisku o ograniczonych zasobach myślę, że jedynym rozwiązaniem jest dzielenie i podbijanie: np. buforowanie/układanie płytek (jak w: kafelkach)

Zamiast ładować i przetwarzać obraz jednocześnie, ładujemy/zapisujemy porcje obrazu z nieprzetworzonego pliku danych w celu przetworzenia. Nie jest to trywialne i może być naprawdę skomplikowane w zależności od rodzaju przetwarzania, które chcesz wykonać, ale jest to jedyny sposób, jeśli nie chcesz uwzględniać jakości obrazu.

+0

Myślałem o kafelkach. To sprawia, że ​​przetwarzanie obrazu jest nieco bardziej skomplikowane, ale główną wadą jest to, że na końcu muszę zrekonstruować końcowy plik, który byłby z dużej ilości pliku tymczasowego. To prawdopodobnie wykonalne, ale bardzo ciężkie. – Kamchatka

+0

Jeśli wymiary obrazu nie ulegną zmianie podczas przetwarzania, nie będą potrzebne pliki tymczasowe. Możesz napisać przetworzone sekcje/płytki do odpowiednich sekcji pliku obrazu. –

+0

Dobrze. Obawiam się naprawdę złego czasu przetwarzania z wszystkimi IO. Masz pojęcie, ile wolniej zapisujesz w pamięci flash w porównaniu do pamięci RAM telefonu? – Kamchatka

2

Rzeczywiście, jest to trudne. Ale na wypadek, gdyby obraz był w jakimś ciągłym formacie rastrowym, możesz go zmostkować (patrz java.nio.ByteBuffer) - w ten sposób otrzymasz bufor bajtowy bez przydzielania go.

Powiązane problemy