Исключение OutOfMemoryError при попытке размытия изображения - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь размыть некоторые изображения 1024x1024, и иногда я получаю java.lang.OutOfMemoryError и я не знаю почему

Я тестирую прямо на своем планшете Android 4.1.2, и у меня всегда 1,5 ГБ памяти бесплатно.

Вот класс, который я использую:

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 / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 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) at dalvik.system.NativeStart.main (собственный метод)

...