我正在用各种文本和图像元素建立一个视图。如何在iPhone视图中创建模糊文本?
我想在视图中显示一些文本,并在其后面显示文本的模糊副本,但不仅仅是文本阴影。
如何将高斯模糊文本应用于UIImage或图层?
我正在用各种文本和图像元素建立一个视图。如何在iPhone视图中创建模糊文本?
我想在视图中显示一些文本,并在其后面显示文本的模糊副本,但不仅仅是文本阴影。
如何将高斯模糊文本应用于UIImage或图层?
在桌面上,毫无疑问,你会使用CoreImage来做到这一点。
虽然在手机上,我不认为有一种方法可以使用CoreGraphics来做到这一点。如果它是绝对重要的,OpenGLES可能会提供帮助。
但是,我会建议重新考虑你的界面。我会认为模糊的文字会让人分心。
编辑:mledford在评论中指出,你可以使用CoreAnimation。我不知道手机上的CA是否包含桌面上的模糊半径,但您可以尝试。
iPhone操作系统不提供任何我知道的核心图像过滤器 - 否则,是的,过滤CALayer将是正确的方式来做到这一点。如果NSBitmapImageRep可用,您可以通过向其中绘制文本,缩小图像(缩减采样),然后再次放大图像(上采样)来做原始模糊处理 - 不幸的是,它似乎也丢失了。我已经看到Flash中完成的模糊文本,它(最后我检查过)没有像素级别的过滤;你可以尝试寻找一个教程,看看你可以适应Cocoa Touch。
如果您使用alpha图层,您将获得性能提升。如果可能的话,考虑采用不同的方法(甚至可以预先合成文本并将其平铺为图形而不是多层)。
试试看,并使用仪器检查性能,看看它是否可以接受。如果你在滚动视图中进行滚动,你的滚动将会停止lot。
看看苹果的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);
}
科林,不能你也可以使用Core Animation的层来构建这个吗?不是我推荐它......通过创建一个带有模糊滤镜的图层,然后在顶部组合另一图层? – 2008-10-23 03:48:08
我应该检查。 :-(CALayer属性过滤器的文档摘录)特殊注意事项虽然CALayer类公开了此属性,但Core Image在iPhone OS中不可用,目前可用于此属性的过滤器未定义。“ – 2008-10-23 17:51:40