尝试模糊图像时出现OutOfMemoryError异常

时间:2018-11-05 00:46:45

标签: java android android-studio android-bitmap

我正在尝试模糊某些图像1024x1024,有时会出现java.lang.OutOfMemoryError,我不知道为什么。

我正在直接在平板电脑Android 4.1.2中进行测试,而且我始终有1.5gb的Ram免费。

这是我正在使用的课程:

package com.example.playerclient.blur;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v8.renderscript.*;

public class BlurBuilder {

    private static final float BITMAP_SCALE = 0.6f;


    public static Bitmap blur(Context context, Bitmap image, float blurRadius) {
        Bitmap outputBitmap = null;

        if (image != null) {

            if (blurRadius == 0) {
                return image;
            }

            if (blurRadius < 1) {
                blurRadius = 1;
            }

            if (blurRadius > 25) {
                blurRadius = 25;
            }

            int width = Math.round(image.getWidth() * BITMAP_SCALE);
            int height = Math.round(image.getHeight() * BITMAP_SCALE);

            Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
            outputBitmap = Bitmap.createBitmap(inputBitmap);

            RenderScript rs = RenderScript.create(context);
            ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
            Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
            Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
            theIntrinsic.setRadius(blurRadius);
            theIntrinsic.setInput(tmpIn);
            theIntrinsic.forEach(tmpOut);
            tmpOut.copyTo(outputBitmap);
        }

        return outputBitmap;
    }
}

在这里我调用该方法:

public class MusicaActivity extends AppCompatActivity implements View.OnClickListener {
    // Others methods here.
    private void mostraDadosMusica() {
        Intent intent = getIntent();
        Musica musica = (Musica)intent.getSerializableExtra(MainActivity.VISUALIZA_PLAYER);

        // Where i'm having problems.
        Bitmap originalBmp = BitmapFactory.decodeResource(getResources(), musica.getAlbum().getIdCapa());
        Bitmap resultBmp   = BlurBuilder.blur(this, originalBmp, 15f);
        backgroundImageView.setImageBitmap(resultBmp);
    }
}

这里是异常消息:

  

11-04 22:05:07.453 18928-18928 / com.example.playerclient E / Android运行时:致命异常:主要   java.lang.OutOfMemoryError      在android.graphics.BitmapFactory.nativeDecodeAsset(本地方法)      在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:636)      在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:484)      在android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:512)      在android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:542)      在com.example.playerclient.activity.MusicaActivity.mostraDadosMusica(MusicaActivity.java:48)      在com.example.playerclient.activity.MusicaActivity.onCreate(MusicaActivity.java:87)      在android.app.Activity.performCreate(Activity.java:5188)      在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)      在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)      在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)      在android.app.ActivityThread.access $ 700(ActivityThread.java:140)      在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1237)      在android.os.Handler.dispatchMessage(Handler.java:99)      在android.os.Looper.loop(Looper.java:137)      在android.app.ActivityThread.main(ActivityThread.java:4921)      在java.lang.reflect.Method.invokeNative(本机方法)      在java.lang.reflect.Method.invoke(Method.java:511)      在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1038)      在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)      在dalvik.system.NativeStart.main(本机方法)

0 个答案:

没有答案