Я хочу відобразити зображення на екрані (у мене є діяльність, яка відображає зображення):
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);
Останній рядок кидає java.lang.OutOfMemoryError
Я не розумію, як це зробити ... я повинен створити растрове зображення спочатку (BitmapFactory.decodeFile), але коли я хочу, щоб повернути його я повинен забезпечити джерело растрового вже - як я можу його уникнути?
Дякую
Відповіді:
1 для відповіді № 1Спочатку можна спробувати зменшити розмір зображення перед його декодуванням, додавши inSampleSize в растрових варіантах. як зазначено в документі: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize
Якщо встановлено значення> 1, запитує декодер подвыборки вихідного зображення, повертаючи менше зображення для збереження пам'яті.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
Надія, що допомагає.
0 для відповіді № 2
Якщо ви не робите ніяких божевільних речей, то ваш образ, мабуть, занадто великий.
Вам просто потрібно збільшити вашу купу. Додайте це до файлу маніфесту:
android:largeHeap="true"
0 для відповіді № 3
Ви не можете повертати растрове зображення на місці, оскільки розміри можуть бути різними. Я не знаю, чому неможливо завантажити вже повернутий растровий малюнок.
Можна повертати растрове зображення в місці використання. При малюванні растрового зображення використовуйте матрицю обертання, щоб вона була намальована з обертанням.
Інша справа, що ви, ймовірно, повинні переглянути вашу програму і спробувати звести до мінімуму використання пам'яті. Можливо, растрові зображення, які ви використовуєте, занадто великі, і ви повинні використовувати параметри з параметром inSampleSize, встановленим на 2 або більше.