【问题标题】:How To Blur Image edges in Iphone如何在 Iphone 中模糊图像边缘
【发布时间】:2011-03-17 19:48:01
【问题描述】:

我将三个 UIImage 添加到三个 UIScrollview 中,这些 UIScrollview 位于另一个之下。 我正在尝试找到一种方法来模糊两个滚动视图之间的相邻边缘,但我无法找到一种方法来做到这一点。

有人可以建议一种方法来实现这一点吗?

任何帮助将不胜感激

谢谢

Shumais Ul Haq

【问题讨论】:

    标签: iphone uiscrollview blur edges


    【解决方案1】:

    您可以使用 CALayer.mask 设置“遮罩层”以添加透明区域。在滚动视图上设置它(例如#import <QuartzCore/CALayer.h> ... scrollView.layer.mask = whatever)以使边缘更加透明。

    我不记得图层蒙版是否会自动调整大小。它们在较旧的(例如 3G)设备上的表现也特别差。不过,它可能会做你想做的事。

    【讨论】:

    • 谢谢。我会调查它,希望它可以做我需要的。再次感谢!
    • @tc 你能多解释一下或者给一些示例代码吗谢谢
    【解决方案2】:

    您可以对图像进行一些高斯模糊处理。有人问过这个问题before

    static void blur(V2fT2f *quad, float t) // t = 1
    {
        GLint tex;
        V2fT2f tmpquad[4];
        float offw = t / Input.wide;
        float offh = t / Input.high;
        int i;
    
        glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);
    
        // Three pass small blur, using rotated pattern to sample 17 texels:
        //
        // .\/.. 
        // ./\\/ 
        // \/X/\   rotated samples filter across texel corners
        // /\\/. 
        // ../\. 
    
        // Pass one: center nearest sample
        glVertexPointer  (2, GL_FLOAT, sizeof(V2fT2f), &quad[0].x);
        glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &quad[0].s);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
        glColor4f(1.0/5, 1.0/5, 1.0/5, 1.0);
        validateTexEnv();
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        // Pass two: accumulate two rotated linear samples
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
        for (i = 0; i < 4; i++)
        {
            tmpquad[i].x = quad[i].s + 1.5 * offw;
            tmpquad[i].y = quad[i].t + 0.5 * offh;
            tmpquad[i].s = quad[i].s - 1.5 * offw;
            tmpquad[i].t = quad[i].t - 0.5 * offh;
        }
        glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].x);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glActiveTexture(GL_TEXTURE1);
        glEnable(GL_TEXTURE_2D);
        glClientActiveTexture(GL_TEXTURE1);
        glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &tmpquad[0].s);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindTexture(GL_TEXTURE_2D, tex);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_INTERPOLATE);
        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
        glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_PREVIOUS);
        glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB,         GL_PRIMARY_COLOR);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB,     GL_SRC_COLOR);
        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
        glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_PRIMARY_COLOR);
    
        glColor4f(0.5, 0.5, 0.5, 2.0/5);
        validateTexEnv();
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        // Pass three: accumulate two rotated linear samples
        for (i = 0; i < 4; i++)
        {
            tmpquad[i].x = quad[i].s - 0.5 * offw;
            tmpquad[i].y = quad[i].t + 1.5 * offh;
            tmpquad[i].s = quad[i].s + 0.5 * offw;
            tmpquad[i].t = quad[i].t - 1.5 * offh;
        }
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        // Restore state
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glClientActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, Half.texID);
        glDisable(GL_TEXTURE_2D);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB,     GL_SRC_ALPHA);
        glActiveTexture(GL_TEXTURE0);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glDisable(GL_BLEND);
    }
    

    【讨论】:

    • 感谢您的回复。我已阅读您链接到的主题。据我了解,它正在模糊整个图像。那不是我要找的。我需要模糊滚动视图内容的边缘,无论显示图像的哪个部分,我都需要模糊图像显示部分的边缘。我试图模糊两个滚动视图之间的边缘......所以如果 A 是第一个滚动视图而 B 是第二个并且它们显示为 AAAABBB,那么我希望中间的 AB 被模糊。我希望我的问题现在更清楚了。谢谢!
    • 这就是你做模糊的方式。所以把这些知识应用到那个边缘:)
    • 只需裁剪原始图像并将其粘贴到模糊图像的顶部,您就有了模糊的边缘
    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2017-03-24
    • 2015-03-26
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多