ImageView OutofMemoryException

У меня проблема при вставке изображения в ImageView. Я пробовал несколько способов решить эту проблему, но все равно не получается, следует последняя версия. Размер изображения 3000х3000.

Код:

ImageView iv = (ImageView) findViewById(R.id.imageView);  
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.prueba_plano_2).copy(Bitmap.Config.ARGB_8888, true);
iv.setImageBitmap(originalBitmap);

XML:

 <FrameLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/buttonlayer" >

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            android:contentDescription="@string/desc"
            android:scaleType="matrix" />
</FrameLayout>

Логкат:

06-21 09:32:06.721: E/AndroidRuntime(25709): FATAL EXCEPTION: main
06-21 09:32:06.721: E/AndroidRuntime(25709): java.lang.OutOfMemoryError
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.Bitmap.nativeCreate(Native Method)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:374)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:404)
06-21 09:32:06.721: E/AndroidRuntime(25709):    at 

.............

person romruben    schedule 21.06.2012    source источник
comment
см. мой ответ на stackoverflow.com/questions/10737582/   -  person Shrikant Ballal    schedule 21.06.2012
comment
вы не можете использовать такое большое изображение. Вы должны масштабировать его перед использованием   -  person Andro Selva    schedule 21.06.2012
comment
то вы должны использовать окно поиска, прежде чем спрашивать.   -  person Blackbelt    schedule 21.06.2012
comment
@Shrikant Но моя проблема в загрузке, а не в изменении ориентации   -  person romruben    schedule 21.06.2012
comment
@AndroSelva после поиска я обнаружил, что добавив ARGB_8888, я могу работать с изображениями такого размера без уменьшения   -  person romruben    schedule 21.06.2012
comment
вы должны масштабировать изображение developer.android.com/training/displaying-bitmaps/index .html   -  person Gaurav Vashisth    schedule 21.06.2012
comment
Да, этот вопрос касается изменения ориентации, но изображение должно загружаться при изменении ориентации, поэтому в той же проблеме OOME я также дал другое решение, пожалуйста, проверьте их, это может помочь вам решить это. Спасибо   -  person Shrikant Ballal    schedule 21.06.2012


Ответы (3)


Максимальный размер растрового изображения — 2048 x 2048. Если растровое изображение больше этого значения, его следует масштабировать.
Я использую этот метод для масштабирования растрового изображения:

public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) {   
    if(bitmapToScale == null)
        return null;
    //get the original width and height
    int width = bitmapToScale.getWidth();
    int height = bitmapToScale.getHeight();
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();

    // resize the bit map
    matrix.postScale(newWidth / width, newHeight / height);

    // recreate the new Bitmap and set it back
    return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);
} 

Вы также можете проверить состояние памяти, используя это:

ActivityManager actMgr = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo minfo = new ActivityManager.MemoryInfo();
actMgr.getMemoryInfo(minfo);
if(minfo.lowMemory) { //do something}
person Nermeen    schedule 21.06.2012

Вы также можете загрузить размер изображения без загрузки всего изображения.

android.graphics.BitmapFactory.Options options = new
    android.graphics.BitmapFactory.Options();

options.inJustDecodeBounds = true;

android.graphics.BitmapFactory.decodeFile(filepath, options);

Теперь у вас есть размер изображения, доступный через:

options.outHeight
options.outWidth
person Casper    schedule 21.06.2012

Попробуйте прочитать официальную документацию для разработчиков Android: Эффективная загрузка больших растровых изображений в этой ссылка, учитывая, что вы работаете с ограниченной памятью (мобильные телефоны), в идеале вам нужно загрузить в память только версию с более низким разрешением. Следуйте советам, размещенным в ссылке, и вы избежите проблемы с ОМ.

person K_Anas    schedule 21.06.2012