2010-07-21 10 views
5

Mam bardzo duży obraz i chcę wyświetlić tylko sekcję wielkości ekranu (bez skalowania), a sekcja powinna być po prostu środkiem obrazu. Ponieważ obraz jest bardzo duży, nie mogę odczytać całego obrazu w pamięci, a następnie przyciąć go. To jest to, co do tej pory miałem, ale zapewni OutOfMemory dla dużych obrazów. Nie uważam też, że w opcji WielkośćSkrywowania obowiązuje, ponieważ chcę przyciąć obraz, a nie obniżać rozdzielczość.Crop Bitmap bez odczytu całej bitmapy najpierw

Uri data = getIntent().getData(); 
InputStream is = getContentResolver().openInputStream(data); 
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null); 

Każda pomoc byłaby świetna?

+0

W jakim formacie jest twój obraz? – finnw

+2

jpeg. Grr - komentarz musi być dłuższy ... – timothyjc

Odpowiedz

1

Zgadzam się, że najłatwiej jest przełamać wizerunek się na wiele mniejszych obrazów kafelkami i po prostu załadować odpowiednie z nich, aby obraz jesteś po.

Jeśli jednak nie chcesz tego robić, możesz być zmuszony do przyjrzenia się kodowaniu samego jpeg.

Co można zrobić, to coś na wzór skopiowaniu nagłówka z pliku do nowego pliku, a następnie wyodrębnianie tylko piksele, które chcesz, aby utworzyć nowy plik. Następnie ponowne załadowanie nowego pliku pozwoli ci mieć tylko podzbiór obrazu, z którym chcesz pracować, a wszystkie standardowe funkcje i klasy java będą w równym stopniu dostępne do użycia.

wiem, że nie zawsze jest elegancki i proste rozwiązanie, jednak nie gwarantuje, że będzie można korzystać z oryginalnego funkcjonalności java, które można oczekiwać, aby być w stanie wykorzystać.

+0

Wygląda na to, że jest zbyt ciężko dla moich umiejętności hakerskich. Musiałem zrezygnować z tego projektu z innych ograniczeń technicznych :( – timothyjc

0

Myślę, że zbliżasz się do problemu z niewłaściwego kierunku.

Jeśli bitmapa jest już tak duża, że ​​nie można jej załadować jako pojedynczego obrazu ciągłego, dlaczego przechowywać ją jako pojedynczy obraz? Pokrój go na płytki, a następnie załaduj środkową płytkę/płytki i postępuj zgodnie z nimi.

+0

Tak. Nie chcę czytać całego obrazu w pamięci, tylko środkowy kafelek, jak go umieszczasz. Czy masz jakiś kod do tego? – timothyjc

+0

@timothyjc: Aby pokroić w plasterki? Możesz użyć czegoś takiego jak Imagemagick, aby zrobić to poza aplikacją. http://superuser.com/questions/35832/splita-a-image-into-tiles –

1

Można to zrobić w 2 etapach:

  1. uzyskać rozmiaru mapy bitowej, korzystając inJustDecodeBounds = true.

  2. użycie BitmapRegionDecoder zdekodować tylko część, którą chcesz.

Wadą? działa tylko z API 10 (ale to już większość ...).

+0

to jest dobry pomysł, ale problem polega na tym, że przycięty obraz może być zbyt duży i może wystąpić OOM –

+1

Jeśli bitmapy nie można zapisać w stercie, spowoduje to OOM, możesz sprawdzić, ile zajmie i unikniesz OOM, jeśli masz dużą mapę bitową i musisz ją przyciąć i uniknąć OOM, możesz użyć JNI, tak jak tutaj: https: // github.com/AndroidDeveloperLB/AndroidJniBitmapOperations –

+0

będę absolutnie spróbować biblioteki. thanls –

Powiązane problemy