【问题标题】:How do I create blurred text in an iPhone view?如何在 iPhone 视图中创建模糊文本?
【发布时间】:2010-09-18 15:27:43
【问题描述】:

我正在构建一个包含各种文本和图像元素的视图。

我想在视图中显示一些文本,并在其后面显示文本的模糊副本,而不仅仅是文本阴影。

如何将高斯模糊文本应用到 UIImage 或图层上?

【问题讨论】:

    标签: iphone objective-c cocoa-touch graphics uikit


    【解决方案1】:

    查看 Apple 的 GLImageProcessing iPhone 示例。除其他外,它会进行一些模糊处理。

    相关代码包括:

    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);
    }
    

    【讨论】:

    • 假设可以在没有 openGL ES 视图的简单 cocoa-touch 应用程序中使用 openGL ES 是否正确?我可以使用 openGL 来进行模糊过滤吗?并将输出写入 UIImage?
    • 不,我似乎记得代码中出现了一些 EAGLView 和 glview。我正在试验我在以下 URL 中找到的代码,它产生的模糊效果比上面的代码好得多。 incubator.quasimondo.com/processing/fast_blur_deluxe.php
    • 它并不快,但如果你只需要它来模糊 UILabel 或文本,它可能会很好用。
    【解决方案2】:

    iPhone OS 不提供我所知道的任何 Core Image 过滤器 - 否则,是的,过滤的 CALayer 将是正确的方法。如果 NSBitmapImageRep 可用,您可以通过将文本绘制到它来进行原始模糊,缩小图像(下采样),然后再次放大图像(上采样) - 不幸的是它似乎也丢失了。我见过在 Flash 中完成的模糊文本,(最后我检查过)没有像素级过滤;您可以尝试寻找有关该内容的教程,看看您可以适应 Cocoa Touch。

    【讨论】:

      【解决方案3】:

      在桌面上,毫无疑问,您会使用 CoreImage 来执行此操作。

      不过,在电话上,我认为不存在使用 CoreGraphics 执行此操作的方法。如果它是绝对关键的,OpenGLES 可能会提供帮助。

      但是,我建议重新考虑您的界面。我认为模糊的文字会分散注意力。

      编辑:mledford 在 cmets 中指出您可以使用 CoreAnimation。不知道手机上的CA是否像桌面一样包含模糊半径,你可以试试。

      【讨论】:

      • Colin,你不能也使用核心动画层来构建它吗?不是我推荐它...通过创建一个带有模糊滤镜的图层然后在上面合成另一个图层?
      • 我应该检查一下。 :-( 关于 CALayer 属性过滤器的文档摘录。“特殊注意事项虽然 CALayer 类公开了此属性,但 Core Image 在 iPhone OS 中不可用。目前可用于此属性的过滤器未定义。”
      【解决方案4】:

      如果您使用 Alpha 层,您的性能会受到影响。如果可能,考虑一种不同的方法(甚至可以预先合成文本并将其展平为图形而不是多层)。

      试一试,并使用 Instruments 来检查性能,看看它是否可以接受。如果您在滚动视图中执行此操作,您的滚动将陷入很多

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2014-07-04
        • 2023-03-18
        • 2011-03-17
        • 1970-01-01
        • 2021-03-06
        相关资源
        最近更新 更多