tampilan gambar android kehabisan memori kesalahan

Dalam proyek Android saya, saya memiliki imageButton, dan setelah mengkliknya, itu harus membuka Aktivitas baru dengan imageView, dan di Aktivitas baru saya, saya harus melihat gambar ImageButton hanya dalam tipe besar, ukuran gambar saya 17mb, dan saya kehabisan memori kesalahan. Tetapi kode saya berfungsi untuk gambar dengan ukuran kecil. Adakah yang bisa membantu mengubah ukuran gambar atau mengubah beberapa opsi bitmap atau memberi saran dengan cara lain? Saya baru di Android, dan maaf untuk bahasa Inggris yang buruk :)

Ini XML Aktivitas baru saya

<?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>

dan kode 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 sumber
comment
stackoverflow.com/a/7400814/792232 periksa ini   -  person Abhi    schedule 03.09.2012
comment
Jika saya menulis sesuatu seperti ini Bitmap btm = etImageToImageView(myUri.toString()); img1.setImageBitmap(btm); itu harus berhasil? atau aku melakukan sesuatu yang salah? Dan terima kasih banyak :)   -  person Hayk Nahapetyan    schedule 03.09.2012
comment
Lewati jalur gambar ke metode saya di sana di tautan   -  person Abhi    schedule 03.09.2012


Jawaban (5)


dalam kode Anda mulai dari if(null != path) ubah menjadi ini

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
bagaimana kita bisa memberikan jalur jika ingin mengubah ukuran gambar drawable - person swati; 27.09.2012
comment
ini berfungsi untuk saya, pertama Anda mendapatkan bitmap asli kemudian Anda dapat mengubah ukurannya - person ; 15.05.2013
comment
Bitmap bitmapOriginal = BitmapFactory.decodeFile(jalur); gambar sudah dimuat di memori, Jadi menurut saya ini tidak akan membantu, tetapi akan lebih buruk. - person taotao; 02.06.2015

Saya memiliki beberapa masalah dengan pengecualian Images dan OutOfMemory, dan semuanya jelas disebabkan oleh fakta bahwa saya menggunakan terlalu banyak memori yang ditetapkan untuk aplikasi (disebut heap).

Seperti yang saya lihat di kode Anda, Anda membuat gambar setiap kali Anda menekan tombol, dan seperti yang Anda katakan, jika Gambar berukuran 17M, mungkin jika perangkat Anda berkualitas rendah, ia memiliki 20M tumpukan maksimal untuk setiap aplikasi, jadi Anda kehabisan memori dengan dua gambar.

Mungkin Anda bisa membuat gambar hanya satu kali, jika harus membuat lebih dari satu gambar, coba hapus gambar sebelumnya, dan coba hubungi System.gc(), mungkin bisa membantu.

Jika Anda benar-benar perlu membuat lebih dari satu gambar, lebih dari satu kali, Anda dapat membuat contoh gambar yang diperkecil, dengan menyetel opsi inSampleSize sebelum Anda membuat gambar. Jika Anda memberi nilai 2 pada atribut ini, Anda akan mendapatkan gambar 1/2 dari aslinya, dengan kualitas dan ukuran yang lebih kecil.

Sesuatu seperti ini:

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

Kemudian buat gambar dengan opsi ini.

PS: Tidak perlu menelepon super.onCreate() lebih dari sekali.

person Victor de Francisco Domingo    schedule 03.09.2012
comment
Saya mencoba sesuatu seperti ini, tapi sejujurnya itu tidak akan berhasil, tapi sekarang setelah jawaban Anda saya memahaminya secara mendalam, saya akan coba lagi :) terima kasih banyak - person Hayk Nahapetyan; 03.09.2012

kode di bawah ini dapat membantu Anda mengubah ukuran Gambar

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

Saya menyadari ini adalah topik lama, tetapi karena saya sendiri baru saja menemukan kesalahan ini hari ini, dan menemukan bahwa saya menerima kesalahan yang sama, namun dengan alasan berbeda, saya ingin memposting perspektif berbeda mengenai masalah ini.

Dalam kasus saya, ini adalah masalah dimensi yang terlalu besar, dan bukan ukurannya (200K). Setelah mengubah ukuran ke ukuran yang lebih kecil (640px x 480px) masalahnya teratasi.

Semoga ini dapat membantu orang lain di masa depan yang menemukan postingan ini.

person Azadi B.    schedule 01.03.2015

Solusi di atas tidak berfungsi dalam kasus saya, jadi menurut saya ini berfungsi untuk saya. Coba yang ini.

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);
}

Kemudian atur kembali Bitmap ke imageView Anda seperti di bawah ini

yourImageView.setImageBitmap(returnedBitmap);
person Dulanga    schedule 03.07.2019