Como usar o efeito de desfoque Renderscript sem artefatos?
Existem muitos lugares (incluindoaqui) para mostrar como usar o Renderscript para desfocar imagens, como:
@TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
public static Bitmap renderScriptBlur(Context context, Bitmap srcBitmap, @FloatRange(from = 0.0f, to = 25.0f) float radius) {
if (srcBitmap == null)
return null;
Bitmap outputBitmap = null;
RenderScript rs = null;
try {
rs = RenderScript.create(context);
outputBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(outputBitmap);
canvas.drawBitmap(srcBitmap, 0, 0, null);
Allocation overlayAlloc = Allocation.createFromBitmap(rs, outputBitmap);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(overlayAlloc);
blur.setRadius(radius);
blur.forEach(overlayAlloc);
overlayAlloc.copyTo(outputBitmap);
return outputBitmap;
} catch (Exception ex) {
if (outputBitmap != null)
outputBitmap.recycle();
return srcBitmap;
} finally {
if (rs != null)
rs.destroy();
}
}
O problemaGeralmente funciona muito bem, mas ao usar algumas imagens e / ou configurações de raio, a imagem de saída possui artefatos que se parecem com linhas de digitalização:
O que eu tenteiDescobri que existem soluções de desfoque mais agradáveis (comoaqui), mas eles não usam o Renderscript e também são lentos e consomem memória.
Também tentei diminuir a imagem de entrada, mas a saída ainda possui artefatos de linhas de varredura.
Por fim, também relatei sobre isso,aqui.
A questãoÉ possível usar o Renderscript para desfocar imagens sem esses Artifcats? Há algo de errado com o que eu escrevi?