永久模糊更改位图

时间:2018-08-07 11:01:04

标签: android bitmap blur renderscript

我有一个搜索栏,在搜索栏发生更改时,我运行此Async任务以使位图模糊;因此,基本上,当我将搜寻栏移至右侧位图时,其模糊程度应更高,而当移至左侧时,模糊度应较小。但是,当我开始移动时,即使将其向左移动,搜索栏位图也会越来越模糊,从而减小了模糊半径。从代码中可以看出,我从未更改过“ mainBitmap”,但是在调试应用程序时,我看到activity.mainBitmap有所更改,这就是为什么当搜索栏移动时逐渐使位图模糊的原因。

任何想法我在这里犯什么错误。

谢谢!

 private final class Blur extends AsyncTask<Integer, Void, Bitmap> {

    @Override
    protected void onPreExecute(){

        activity.showProgressBar();
    }

    @Override
    protected Bitmap doInBackground(Integer... params) {

        Bitmap bitmap = activity.mainBitmap;

        Bitmap outputBitmap = Bitmap.createBitmap(bitmap);
        RenderScript renderScript = RenderScript.create(activity);

        Allocation tmpIn = Allocation.createFromBitmap(renderScript, bitmap);
        Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);
        //Intrinsic Gaussian blur filter
        ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));

        theIntrinsic.setRadius(params[0]);

        theIntrinsic.setInput(tmpIn);
        theIntrinsic.forEach(tmpOut);
        tmpOut.copyTo(outputBitmap);

        return outputBitmap;
    }

    @Override
    protected void onPostExecute(Bitmap newBit) {

        activity.hideProgressBar();
        activity.mainImage.setImageBitmap(newBit);
    }

2 个答案:

答案 0 :(得分:0)

您只是通过了reference中的mainBitmap,这就是mainBitmap更改的原因。您应该对其进行复制,然后对其进行模糊处理。

代替

Bitmap bitmap = activity.mainBitmap;

您应该使用:

Bitmap bitmap = activity.mainBitmap.copy(activity.mainBitmap.getConfig(),true);

答案 1 :(得分:0)

与其在onSeekChange中为每个值一次又一次地创建位图, 这将通过OutOfMemoryException

按照此步骤 -创建一张完全模糊的图像 -在您的主图像上再添加一个图像视图,并将其上的模糊位图设置为叠加层,并将其alpha 0设置为完全透明。 -现在,当用户移动搜索栏时,尝试更改覆盖的模糊图像的Alpha。