Как жить размытым растровым изображением с помощью рендерскрипта?

Мне нужно размыть изображение с помощью 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