【问题标题】:UIImage nonlinear resizingUIImage 非线性调整大小
【发布时间】:2013-06-22 03:36:07
【问题描述】:

我有单色图像,我需要从中调整某些部分的大小,具有不同的比例。所需结果显示在图像中。 我看过在 opengles 中应用网格,但我找不到一些示例代码或更详细的教程。 我还查看了imgwrap,但据我所知,这个库需要 qt 框架。任何想法、示例代码或进一步阅读的链接将不胜感激,谢谢。

【问题讨论】:

标签: ios objective-c opencv opengl-es


【解决方案1】:

一些想法:

  1. 使用复制部分 UIImage 到不同的 CGContext CGBitmapContextCreateImage(),复制周围的部分,缩放 单独的,重新组合在一起。
  2. 对图像的某些部分使用 CIFilter 效果,遮盖您要缩放的部分。 (Core Image Programming Guide)

【讨论】:

  • 知道哪个 CIFilter 可以完成这项工作吗?
  • 是的,这是显而易见的问题,他们有比我用过的更多的选择。如果您可以访问今年的 WWDC 示例,有一个很好的演示应用程序,您可以测试所有过滤器(只需转到开发人员门户)。另一个列表在这里:developer.apple.com/library/ios/#documentation/graphicsimaging/…
【解决方案2】:

我不确定,但我建议如果你想做这种类型的工作,那么你需要为图像裁剪一些部分,并在这个裁剪的图像部分应用你的调整大小特性/功能,并按原样放置。我只是给出我的意见,不确定它是否适合你。

这里我也给你问题的链接,请阅读它,它可能对你的情况有帮助:

How to scale only specific parts of image in iPhone app?

【讨论】:

  • MrTJ 的回答更接近我认为 OP 想要的。
  • 感谢 iPatel,我已经尝试裁剪图像并调整特定部分的大小,但这种方法的问题是,当图像被裁剪调整大小然后组合在一起时,会有边缘并且图像看起来不会一致。
【解决方案3】:

您面临的问题在计算机图形学中称为“图像变形”。首先,您必须在原始图像中定义一些控制点,并在示例目标图像中定义相应点。然后你必须计算一个密集的位移场(在这个应用程序中也称为环绕网格)并将这个场简单地应用于原始图像。

更实际地:您在 iOS 上的最佳选择是在 OpenGL 中创建一个 2D 顶点网格。将您的原始图像映射为该网格上的纹理,并通过置换其一些点来使原始网格变形。然后,您只需使用 glReadPixels 对生成的图像进行屏幕截图。

我不知道任何 CIFilter 可以实现这种位移场映射。

更新:我还发现了一个示例代码,它使用 8 个控制点通过 OpenCV 变形图像。 http://engineeering.blogspot.it/2008/07/image-morphing-with-opencv.html

OpenCV 有适用于 iOS 的端口,因此您也可以在目标设备上使用上面链接中的代码进行简单的试验。

【讨论】:

  • 感谢 MrTJ,您的回答很可能是做到这一点的最佳方法,但也是最困难且耗时的。我已经写过我正在寻找更轻松的方法的问题。
  • 我没有想到任何更简单的东西。如果您需要有关 OpenGL 的快速实用教程,我可以推荐 iphonedevelopment.blogspot.it/2009/05/…
  • 我还发现(并添加)了上述算法的 OpenCV 实现。
【解决方案4】:

您可能希望了解 OpenGL 着色器。我要做的是将图像作为纹理加载,应用片段着色器(这是一个小程序,可以让您改变扭曲图像),将结果渲染回纹理,然后显示该纹理或将其保存为位图。

这并不简单,但有一些示例代码可用于其他扭曲。这是着色器中的一个漩涡: http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/

我认为在不涉及 OpenGL 的情况下没有更简单的方法可以做到这一点,而且您可能也不会在 GPU 之外找到出色的性能。

【讨论】:

  • 感谢 Colin,这可能是满足我要求的最强大的方法,但我写的问题是我正在寻找比 OpenGL 更轻的方法。
  • 是的,我看到了。我只是不确定是否有比 OpenGL 更轻松的方法。它可能尽可能轻。 :)
【解决方案5】:

您可能想尝试使用薄板样条曲线和 OpenCV 的 this example。在我看来,这是最容易尝试的在线解决方案。

【讨论】:

  • 这看起来棒极了!就像我看到的那样,这是一种用网格创建图像扭曲的简单方法,还是我错了?我已经实现了 GPUImageBulgeDistortionFilter,但是如果客户端更改要求,这可能会有所帮助。
  • 确实很棒。没有一个库提供像这样简单的界面。如果您需要比 GPUImageBulgeDistortionFilter 更多的自定义扭曲,这是一个不错的选择。
【解决方案6】:

我建议您查看 Brad Larson 在 GitHub 上的 GPUImage 项目。在视觉效果下,您会找到GPUImageBulgeDistortionFilter 等过滤器,您应该可以根据自己的需要进行调整。

【讨论】:

  • 谢谢,这是我同时选择的解决方案,到目前为止它对我的问题非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多