Android-просмотр изображения из-за ошибки памяти

В моем Android-проекте у меня есть imageButton, и после нажатия на него он должен открыть новую активность с imageView, а в моей новой активности я должен видеть изображение ImageButton только крупным шрифтом, размер моего изображения 17 МБ, и мне не хватило памяти ошибка. Но мой код работает для изображений небольшого размера. Может ли кто-нибудь помочь изменить размер изображения или изменить некоторые параметры растрового изображения или посоветовать другой способ? Я новичок в Android, и извините за плохой английский :)

Вот мой новый XML Activity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:id="@+id/LL11"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
<TextView
 android:id="@+id/textView1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Here must be an image">
</TextView>

<ImageView
    android:id="@+id/imageView1"
    android:maxWidth="10px"
    android:maxHeight="10px"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/ic_action_search" />

</LinearLayout>

и java-код

package com.example.example;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;

package com.example.example;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;

public class ActivityTwo extends Activity {


    @Override
      protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_dialog);
        Bundle extras = getIntent().getExtras();
        String path = extras.getString("path");
        if(null != path) 
        {
            Uri myUri = Uri.parse(path);
            super.onCreate(savedInstanceState);
            ImageView img1 = (ImageView) findViewById(R.id.imageView1);
           img1.setImageURI(myUri);

        }
    }
}

person Hayk Nahapetyan    schedule 03.09.2012    source источник
comment
stackoverflow.com/a/7400814/792232 проверьте это   -  person Abhi    schedule 03.09.2012
comment
Если я напишу что-то вроде этого Bitmap btm = etImageToImageView(myUri.toString()); img1.setImageBitmap (БТМ); это должно работать? или я что-то не так делаю? и большое спасибо :)   -  person Hayk Nahapetyan    schedule 03.09.2012
comment
Передайте путь к моему методу там, в ссылке   -  person Abhi    schedule 03.09.2012


Ответы (5)


в вашем коде начните с if(null != path) измените на это

int size = 10; //minimize  as much as you want
if(path != null){
     Bitmap bitmapOriginal = BitmapFactory.decodeFile(pathath);
     Bitmap bitmapsimplesize = Bitmap.createScaledBitmap(bitmapOriginal,bitmapOriginal.getWidth() / size, bitmapOriginal.getHeight() / size, true);
     bitmapOriginal.recycle();
     img1.setImageBitmap(bitmapsimplesize);

}
person Community    schedule 03.09.2012
comment
как мы можем указать путь, если хотим изменить размер изображения для рисования - person swati; 27.09.2012
comment
это работает для меня, сначала вы получаете исходное растровое изображение, а затем можете изменить его размер. - person ; 15.05.2013
comment
Bitmap bitmapOriginal = BitmapFactory.decodeFile(путь); изображение уже загружено в память, поэтому я не думаю, что это поможет, но будет хуже. - person taotao; 02.06.2015

У меня были некоторые проблемы с исключениями Images и OutOfMemory, и все они, очевидно, вызваны тем, что я использую слишком много памяти, выделенной для приложения (называемой кучей).

Как я вижу в вашем коде, вы создаете изображение каждый раз, когда нажимаете кнопку, и, как вы сказали, если изображение имеет размер 17M, возможно, если ваше устройство имеет низкое качество, оно имеет 20M максимальной кучи для каждого приложения, так что у вас нет памяти с двумя изображениями.

Возможно, вы можете создать изображение только один раз, если вам нужно создать более одного изображения, попытаться удалить предыдущие изображения и попытаться вызвать System.gc(), это может быть полезно.

Если вам действительно нужно создать более одного изображения более одного раза, вы можете создать уменьшенный экземпляр изображения, установив параметр inSampleSize перед созданием изображения. Если вы присвоите этому атрибуту значение 2, вы получите 1/2 изображение оригинала с уменьшенным качеством и размером.

Что-то вроде этого:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; // Or other value that you estimate

Затем создайте образ с этими параметрами.

PS: нет необходимости вызывать super.onCreate() более одного раза.

person Victor de Francisco Domingo    schedule 03.09.2012
comment
Я пробовал что-то вроде этого, но, честно говоря, это не сработает, но теперь, после вашего ответа, я глубоко понял это, я попробую еще раз :) большое спасибо - person Hayk Nahapetyan; 03.09.2012

приведенный ниже код может помочь вам изменить размер изображения

File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                File output = new File(dir, "image.png");


    path = output.getAbsolutePath();
    Bitmap b =  BitmapFactory.decodeFile(cPath);
    Bitmap out = Bitmap.createScaledBitmap(b, 320, 480, false);
    FileOutputStream fout;
    try{
        fout = new FileOutputStream(output);
        out.compress(Bitmap.CompressFormat.PNG, 100, fout);
        fout.flush();
        fout.close();
        b.recycle();
        out.recycle();
    }catch(Exception e){
        e.printStackTrace();
    }
person Hardik Nadiyapara    schedule 03.09.2012

Я понимаю, что это старая ветка, но поскольку я только сегодня сам столкнулся с этой ошибкой и обнаружил, что получил ту же ошибку, но по другой причине, я хотел опубликовать другую точку зрения на этот вопрос.

В моем случае это была проблема слишком больших размеров, а не размера (200 КБ). После изменения размера до меньшего размера (640px x 480px) проблема была решена.

Надеюсь, это может помочь кому-то еще в будущем, кто наткнется на этот пост.

person Azadi B.    schedule 01.03.2015

Приведенные выше решения не работают в моем случае, поэтому я обнаружил, что это работает для меня. Попробуйте это.

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
    BitmapFactory.Options op = new BitmapFactory.Options();
    op.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(
            getActivity().getContentResolver().openInputStream(selectedImage), null, op);

    final int REQUIRED_SIZE = 1000;

    int width_tmp = op.outWidth, height_tmp = op.outHeight;
    int scale = 1;
    while (true) {
        if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
            break;
        }
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    BitmapFactory.Options op2 = new BitmapFactory.Options();
    op2.inSampleSize = scale;
    return BitmapFactory.decodeStream(
            getActivity().getContentResolver().openInputStream(selectedImage), null, op2);
}

Затем set вернул Bitmap в ваш imageView, как показано ниже.

yourImageView.setImageBitmap(returnedBitmap);
person Dulanga    schedule 03.07.2019