【问题标题】:How can you apply distortions to a UIImage using OpenGL ES?如何使用 OpenGL ES 对 UIImage 应用失真?
【发布时间】:2012-03-27 09:34:09
【问题描述】:

有没有什么方法可以像在 iPhone 应用程序PhotoTwist 中那样使用 OpenGL ES 在 UIImage 上创建凹痕、挤压、扭曲、挤压等效果?

是否有任何参考或指导方针?我不需要代码,只是关于如何执行此操作的参考。

【问题讨论】:

标签: iphone objective-c ios opengl-es core-graphics


【解决方案1】:

进行此类图像处理的最高效方法是使用 OpenGL ES 2.0 着色器。再一次,如果我可以将您指向我的GPUImage 框架,它可以执行您描述的许多失真操作。对于那些缺少的,您可以编写自己的片段着色器。

我在那里的效果是凸凸变形(使用 GPUImageBulgeDistortionFilter):

凹形失真(使用与前一个滤波器相反的比例参数):

漩涡扭曲(使用 GPUImageSwirlFilter):

最后,夹点失真(使用 GPUImagePinchDistortionFilter):

如果您查看用于每个过滤器的着色器,您会发现它们之间的数学非常相似。您应该能够对其进行调整,以从同一基础上生成您自己的自定义效果。

将这些过滤器应用于 UIImage 是相当容易的。如果您只想使用一个过滤器,则可以执行以下操作:

UIImage *inputImage = [UIImage imageNamed:@"test.jpg"];
GPUImageBulgeDistortionFilter *stillImageFilter = [[GPUImageBulgeDistortionFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage];

这将从磁盘创建一个 UIImage,使用 OpenGL ES 对其进行过滤,并返回一个过滤后的 UIImage 供您使用。如果您想执行更高级的链接效果,可以使用 GPUImagePicture 和自定义过滤器管道,或者您可以使用不同的输入源过滤实时摄像机视频或电影。

此项目的源代码在 BSD 许可下的上述链接中提供,因此您可以深入了解如何在 OpenGL ES 之间传输数据以及如何执行这些类型的过滤器。

【讨论】:

  • GPUImage 是一个很棒的库!我让过滤器处理静态图像,但现在我想知道平滑动画失真的最佳方法是什么?
  • @Robert - 您希望在设定的持续时间内在动画的任何值的起点和终点之间进行插值。对于每个新帧,设置过滤器的属性。对于电影,这将自动应用于下一个传入的视频帧,但您可能需要使用 -processImage 强制重新渲染静态图像。
  • 很好的解决方案,有很好的解释,包括示例。我喜欢我这边+10 ;)
  • @BradLarson Android 有这样的库吗?
  • 谢谢@BradLarson 我已经浏览了这个库,它似乎没有失真过滤器,我用于 ios 应用程序的一个 BulgeDistortion 过滤器不适用于 Android
【解决方案2】:

来自 Apple Developer Connection 的照片编辑扩展示例代码正是这样做的。

【讨论】:

  • 我在其他地方对此作出了回应,但澄清一下,您上面写的不是glslang,而是Core Image kernel language。 Core Image 内核语言虽然基于 GLSL (glslang),但它是专有的,并且具有 GLSL 没有的某些限制。例如,上面代码中的运行时 if() 语句将阻止它在 Core Image 中编译和运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多