1

在我的 Android 项目中我有 imageButton ,点击它后,它必须用 imageView 打开新的 Activity ,在我的新 Activity 中我必须看到 ImageButton 的图像只有大字体,我的图像大小是 17mb ,我内存不足错误。但我的代码适用于尺寸较小的图像。有人可以帮助调整图像大小或更改一些位图选项或以其他方式提供建议吗?我是 android 新手,抱歉英语不好 :)

这是我的新活动的 XML

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

        }
    }
}
4

5 回答 5

8

在你的代码中开始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);

}
于 2012-09-03T19:59:12.373 回答
4

我遇到了一些问题ImagesOutOfMemory异常,所有这些显然都是由于我使用了太多为应用程序分配的内存(称为堆)而引起的。

就像我在您的代码中看到的那样,您每次按下按钮时都会创建一个图像,并且就像您说的那样,如果图像具有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()多次调用。

于 2012-09-03T17:49:15.373 回答
3

下面的代码可以帮助您调整图像大小

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();
    }
于 2012-09-03T15:13:48.750 回答
1

我意识到这是一个旧线程,但是由于我今天自己遇到了这个错误,发现我收到了同样的错误,但是出于不同的原因,我想对此事发表不同的看法。

就我而言,这是尺寸太大的问题,而不是尺寸(200K)。调整为更小的尺寸(640 像素 x 480 像素)后,问题得到解决。

希望这可以帮助将来遇到这篇文章的其他人。

于 2015-03-01T01:18:53.713 回答
0

上述解决方案不适用于我的情况,所以我发现它对我有用 试试这个。

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

然后设置返回Bitmap到你imageView喜欢的下面

yourImageView.setImageBitmap(returnedBitmap);
于 2019-07-03T18:23:48.983 回答