2013-03-10 9 views
7

Tworzę aplikację dla systemu Android i muszę załadować obraz (bitmapę) w jamie i zmienić jego rozmiar za pomocą gestu "przybliżenia palcem". Jednak gdy obraz przekracza pewien rozmiar, aplikacja ulega awarii (wyjątek OutOfMemory). Jak zoptymalizować ładowanie i manipulowanie obrazem?Ładowanie dużych bitmap przez Androida

Aby załadować obraz używam:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

Aby wyciągnąć go:

imgCanvas.drawBitmap (image, posX, posY, null), 

Aby zmienić jego rozmiar:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

Odpowiedz

3

To nie jest trywialne.

podstawie aktualnej skali obrazu i aktualnie widocznej części obrazu, tylko załadować część tego obrazu na odpowiednim uchwały:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

Po powiększeniu-out i chcesz pokazać cały obraz skalowany w dół, za pomocą metody z tej BitmapRegionDecoder klasy, które mają parametr BitmapFactory.Options i ustawić inSampleSize do wartości większej niż 1 (korzystnie do wartości, która jest potęgą liczby 2)
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

podczas powiększania pierwsze powiększenie niższa rozdzielczość, która jest już wyświetlana (w której użyto wartości inSampleSize> 1) i leniwie ładowana wersja o wyższej rozdzielczości (gdzie inSampleSize jest mniejsza niż poprzednia używana wartość) przy użyciu BitmapRegionDecoder i stopniowo przechodzić w wersję o wyższej rozdzielczości.

Kiedy użytkownik powiększa, dalej robić to aż do inSampleSize to 1.

+0

początkowo załadować obraz w oryginalnym rozmiarze (z inSampleSize = 1). Kiedy robię "powiększenie", muszę zmienić wielkośćSampleSize z wartością> 1, a następnie przyciąć obraz? – Giammy

+0

Przed zbliżeniem użytkownika, ładujesz cały obraz za pomocą opcji inSampleSize> 1. Następnie, gdy użytkownik powiększy, w niektórych punktach ponownie załaduje obraz, ale tylko jego część i rozmiar inSampleSize, który ma niższą wartość (ale wciąż więcej niż 1). Gdy użytkownik powiększy w kółko, twój inSampleSize = 1 (i załadujesz tylko tę część, która jest widoczna). –

Powiązane problemy