Как да живея замъглено растерно изображение с renderscript?

Трябва да замъгля изображението с SeekBar, което позволява на потребителя да контролира радиуса на замъгляването. Използвам този метод по-долу, но изглежда, че губя памет и време поради създаването на нови растерни изображения при всяко извикване на функция, когато стойността на SeekBar се промени. Какъв е най-добрият подход за внедряване на замъгляване на живо с RenderScript?

 public static Bitmap blur(Context ctx, Bitmap image, float blurRadius) {
    int width = Math.round(image.getWidth() * BITMAP_SCALE);
    int height = Math.round(image.getHeight() * BITMAP_SCALE);        
    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);          
    Bitmap outputBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    RenderScript rs = RenderScript.create(ctx);
    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);
    rs.destroy();
    if(inputBitmap!=outputBitmap)
        inputBitmap.recycle();
    return outputBitmap;
}

person user65721    schedule 28.04.2015    source източник


Отговори (1)


Тези обаждания могат да бъдат доста скъпи и наистина трябва да се извършват във външна част на вашето приложение. След това можете да използвате повторно контекста/обекта на RenderScript и ScriptIntrinsicBlur, когато имате нужда от тях. Също така не трябва да ги унищожавате, когато функцията приключи (тъй като ще ги използвате повторно). За по-големи спестявания можете да прехвърлите действителните входно/изходни растерни изображения към вашата рутина (или техните разпределения) и да ги поддържате стабилни. Наистина има много динамично създаване/унищожаване в този фрагмент и мога да си представя, че някои от тези неща не се променят често (и следователно не е необходимо да продължават да бъдат пресъздавани от нулата).

...
RenderScript rs = RenderScript.create(ctx);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs,  Element.U8_4(rs));
...
person Stephen Hines    schedule 28.04.2015