如何在Android中模糊部分图像?

如何在Android中模糊部分图像?,android,image-processing,android-canvas,motion-blur,Android,Image Processing,Android Canvas,Motion Blur,我在一个项目中工作,我必须显示图像的一部分清晰,并使图像的其余部分模糊。模糊应该由滑块管理。意味着它可以增加或减少。最终的结果图像应与下图相似 在我的研究过程中,我发现下面的链接很有用 但上述链接中的问题是,它们都会使图像完全模糊。不是图像的某一部分 请提出一些解决方案来实现这一点。提前谢谢 做几次蒙版模糊 创建遮罩 0表示模糊(黑色),而=1表示不模糊(白色)。以足够大的值初始化此部分,例如w=100像素 创建遮罩模糊功能 只是一个普通的卷积,和一些矩阵类似 0.0 0.1 0.0 0

我在一个项目中工作,我必须显示图像的一部分清晰,并使图像的其余部分模糊。模糊应该由滑块管理。意味着它可以增加或减少。最终的结果图像应与下图相似

在我的研究过程中,我发现下面的链接很有用

  • 但上述链接中的问题是,它们都会使图像完全模糊。不是图像的某一部分

    请提出一些解决方案来实现这一点。提前谢谢


    做几次蒙版模糊

  • 创建遮罩

    0
    表示模糊(黑色),而
    =1
    表示不模糊(白色)。以足够大的值初始化此部分,例如
    w=100
    像素

  • 创建遮罩模糊功能

    只是一个普通的卷积,和一些矩阵类似

    0.0 0.1 0.0
    0.1 0.6 0.1
    0.0 0.1 0.0
    
    但仅对图像模糊后遮罩为
    ==0
    的目标像素执行此操作也会模糊遮罩。这应该会将白色区域放大一点(每次迭代像素,但在边框上会丢失大小,这就是为什么
    w>1

  • 循环项目符号#2
    N

    N
    确定模糊/非模糊渐变深度
    w
    仅用于确保毛刺遮罩会增长。。。每次模糊遮罩都会增加其白色部分

  • 这应该可以做到,你也可以使用扩大的面具,而不是模糊它

    [edit1]实施

    我今天玩了一点,发现使用smooth时遮罩没有足够大,所以我稍微更改了一下算法(这里是我的代码C++):

    图片pic0、pic1、pic2;
    //pic0源
    //pic1-输出
    //pic2-掩模
    int x0=400,y0=330,r0=100,dr=200;
    //x0,y0,r0-遮罩区域
    //dr-模糊梯度大小
    int i,r;
    //初始化输出为sourceimage
    pic1=pic0;
    //带渐变圆的初始遮罩(源图像大小)
    pic2.resize(pic0.xs,pic0.ys);
    pic2.clear(0);
    对于(i=1;i>8);
    pic2.bmp->Canvas->Brush->Color=TColor(iPen->Color=TColor(iEllipse(x0-r,y0-r,x0+r,y0+r);
    }
    
    对于(i=1;i如何在前景中使用带剪切遮罩的模糊图像,在背景中使用普通图像?检查这是否有帮助-@MD1948谢谢您的评论,但该解决方案不起作用,因为它不知道在何处显示清晰和在何处显示模糊用户使用触摸移动效果来选择此选项。因此,在何处放置触摸,portion是清晰的,其余部分是模糊的。@DroidWormNarendra这似乎和我在上面的链接中提到的一样。@sanchitsingh您可能需要在每次单击时重新计算图片?感谢您的回答@Spektre。这里有一个问题。我不能使用静态图像进行遮罩,因为要求是要清楚用户点击图像的区域。这意味着,如果用户触摸图像的角区域,它应该是清晰的,静止模糊的。那么我们如何使用静态上部图像进行遮罩。@sanchitsingh我看不出有问题……你用黑色清除遮罩,然后在用户触摸的地方画出圆盘、椭圆、椭圆形或任何白色……中心是触摸开始位置,大小可以从正中完成在用户停止触摸/拖动或在一些滚动条上…@ SangiTigSh今天上午有一点时间的心情,所以我把它拆开了,看一下[ C++版的代码],结果也有一些变化,使它在视觉上更讨人喜欢。
    //---------------------------------------------------------------------------
    void picture::rgb_smooth_masked(const picture &mask,DWORD treshold)
        {
        int i,x,y;
        color *q0,*q1,*m0,c0,c1,c2;
        if ((xs<2)||(ys<2)) return;
        for (y=0;y<ys-1;y++)
            {
            q0=p[y  ]; m0=mask.p[y];
            q1=p[y+1];
            for (x=0;x<xs-1;x++)
             if (m0[x].dd<treshold)
                {
                c0=q0[x];
                c1=q0[x+1];
                c2=q1[x];
                for (i=0;i<4;i++)
                 q0[x].db[i]=DWORD((DWORD(c0.db[i])+DWORD(c0.db[i])+DWORD(c1.db[i])+DWORD(c2.db[i]))>>2);
                }
            }
        }
    //---------------------------------------------------------------------------
    
    0.50,0.25
    0.25,0.00