Это правильный способ эффективной обработки больших изображений (чтобы избежать OutOmMemoryErrorin Android
После многих попыток, благодаря всем энтузиастам Android, я нашел способ эффективно обрабатывать большие изображения в приложениях Android, чтобы избавиться от ошибки outOfMemory. Но мне действительно нужно знать, это правильный формальный способ сделать это. Или мне нужно добавить еще или какие-то изменения должны быть сделаны. Прокомментируйте, пожалуйста.
Bitmap bitmap1;
iv1 = (ImageView) findViewById(R.id.iv1);
iv2 = (ImageView) findViewById(R.id.iv2);
iv3 = (ImageView) findViewById(R.id.iv3);
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.image1);
BitmapFactory.decodeResource(getResources(), R.drawable.image2);
BitmapFactory.decodeResource(getResources(), R.drawable.image3);
int srcWidth = o.outWidth;
int srcHeight = o.outHeight;
int dstWidth = 600;
int dstHeight = 450;
int inSampleSize = 1;
if (srcHeight > dstHeight || srcWidth > dstWidth) {
final int halfHeight = srcHeight / 2;
final int halfWidth = srcWidth / 2;
while ((halfHeight / inSampleSize) > dstWidth
&& (halfWidth / inSampleSize) > dstWidth) {
inSampleSize *= 2;
}
}
o.inSampleSize = inSampleSize;
o.inJustDecodeBounds = false;
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1, o);
iv1.setImageBitmap(bitmap1);
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image2, o);
iv2.setImageBitmap(bitmap1);
Toast.makeText(getApplicationContext(),
"DEcoded", Toast.LENGTH_LONG).show();
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image3, o);
iv3.setImageBitmap(bitmap1);
@Override
protected void onDestroy() {
bitmap1.recycle();
super.onDestroy();
Toast.makeText(getApplicationContext(),
"Bitmap Destroyed", Toast.LENGTH_LONG).show();
}
1 ответ
Кажется, ваш код делает то же самое, что и этот.
Идея состоит в том, что если мы пытаемся показать растровое изображение в области просмотра 300*300, нам не нужно загружать в память довольно большой, скажем, 1000*1000 растровый ресурс. Просто сначала получите соотношение сторон, а затем расшифруйте его до сравнительно меньшего растрового изображения, чтобы сэкономить память (и избежать OOM).
Поэтому я думаю, что этого должно быть достаточно.