/ / Android OutOfMemoryError pri pokuse otáčať obrázok - java, android, bitmapa

Android OutOfMemoryError pri pokuse o otočenie obrázku - java, android, bitmapy

Chcem zobraziť obrázok na obrazovke (mám aktivitu, ktorá zobrazuje obrázok):

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
ExifInterface exif = new ExifInterface(imagePath);
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotationInDegrees = exifToDegrees(rotation);
Matrix matrix = new Matrix();
matrix.preRotate(rotationInDegrees);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

Posledný riadok hodí java.lang.OutOfMemoryError

Nechápem, ako to urobiť ... Najprv musím vytvoriť bitmapu (BitmapFactory.decodeFile), ale keď ju chcem otáčať, musím už poskytnúť zdrojovú bitovú mapu - ako ju môžem vyhnúť?

Vďaka

odpovede:

1 pre odpoveď č. 1

Skôr ako ju dekódujete, môžete skopírovať snímku pridaním inSampleSize v bitmapových možnostiach. ako je uvedené v dokumente: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

Ak je hodnota nastavená na hodnotu> 1, požaduje dekodér, aby podpredsmeroval pôvodný obrázok a vrátil menší obrázok na uloženie pamäte.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);

Dúfam, že to pomôže.


0 pre odpoveď č. 2

Ak neudeláte nejaké bláznivé veci inde, potom je váš obrázok pravdepodobne príliš veľký.

Stačí len zvýšiť hromadu. Pridajte toto do súboru manifestu:

android:largeHeap="true"

0 pre odpoveď č. 3

Nemôžete otočiť bitmapu na mieste, pretože rozmery sa môžu líšiť. Neviem, prečo nie je možné načítať už otočené bitmapy.

Bitovú mapu môžete otáčať v mieste použitia. Pri kreslení bitovej mapy použite rotačnú maticu, aby ste ju nakreslili natočením.

Ďalšou vecou je, že by ste pravdepodobne mali skontrolovať vašu aplikáciu a pokúsiť sa minimalizovať využitie pamäte. Možno, že bitové mapy, ktoré používate, sú príliš veľké a mali by ste použiť možnosti s inSampleSize nastaveným na 2 alebo viac.