永久模糊更改位图

Blur changing bitmap permanently

我有一个搜索栏,在搜索栏发生变化时,我 运行 这个用于模糊位图的异步任务;所以,基本上,当我将搜索栏向右移动时,位图应该更加模糊,而当向左移动时,模糊应该更少。但是当我开始移动我的搜索栏位图时,即使我将它向左移动,它也会变得越来越模糊,模糊半径减小。从代码中可以看出,我从不更改 "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);
    }

您只是传递了 mainBitmapreference 这就是 mainBitmap 发生变化的原因。你应该复制它然后模糊它。

而不是

Bitmap bitmap = activity.mainBitmap;

你应该使用:

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

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

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