2016-07-24 41 views
1

我是IOS图像编辑工作中的新手机。IOS中的图像变形

我想在ios或swift(任何一个)中制作Image Warp的功能。

我搜索大量的谷歌搜索,但没有得到确切的是什么,我想

下面链接的我是searf

How can you apply distortions to a UIImage using OpenGL ES?

https://github.com/BradLarson/GPUImage

https://github.com/Ciechan/BCMeshTransformView

这里是像我想要什么(当我触摸网格点图像时,我们应该包裹,如果我放置格在原来的地方d点的应该是原来的一样聪明)

enter image description here

enter image description here

+0

您不太可能找到您想要的组件,您可以将其复制/粘贴到代码中。 OpenGL是一种先进的,难以学习的API,这就是为了实现您的目标所需要的。实际上,在你准备好解决这个复杂的问题之前,你已经有好几个月的时间了。 –

回答

1

在我的回答看看这个问题:

Warp \ bend effect on a UIView?

您也可以看看这个混帐库:

https://github.com/Ciechan/BCMeshTransformView

这可能是您想要做的一个很好的起点,但您需要了解OpenGL,转换矩阵以及其他许多事情。

你在问什么是相当简单的OpenGL。您只需要设置一个描述修改后的网格点的三角形条。您会将图像作为纹理加载,然后使用三角形条纹渲染纹理。

但是,“直截了当的OpenGL”有点像直截了当的火箭科学。高层次的概念可能很简单,但最终会出现很多非常繁琐的细节,为了使其工作起来,您必须做好准备。

看看这个短片我有我的应用程序Face Dancer

Face Dancer video with grid lines

+0

谢谢邓肯C的好回答。我真的很惊讶有人投下了答案。如果他知道更好的答案,那么请回答这个问题,然后再投票。 – Anny

0

我写了BCMeshTransformView的扩展,它允许你申请以响应用户的触摸输入经变换创建。

extension BCMutableMeshTransform { 
    static func warpTransform(from startPoint:CGPoint, 
           to endPoint:CGPoint, in size:CGSize) -> BCMutableMeshTransform { 
     let resolution:UInt = 30 
     let mesh = BCMutableMeshTransform.identityMeshTransform(withNumberOfRows: resolution, 
                   numberOfColumns: resolution)! 

     let _startPoint = CGPoint(x: startPoint.x/size.width, y: startPoint.y/size.height) 
     let _endPoint = CGPoint(x: endPoint.x/size.width, y: endPoint.y/size.height) 
     let dragDistance = _startPoint.distance(to: _endPoint) 

     for i in 0..<mesh.vertexCount { 
      var vertex = mesh.vertex(at: i) 
      let myDistance = _startPoint.distance(to: vertex.from) 

      let hEdgeDistance = min(vertex.from.x, 1 - vertex.from.x) 
      let vEdgeDistance = min(vertex.from.y, 1 - vertex.from.y) 
      let hProtection = min(100, pow(hEdgeDistance * 100, 1.5))/100 
      let vProtection = min(100, pow(vEdgeDistance * 100, 1.5))/100 

      if (myDistance < dragDistance) { 
       let maxDistort = CGPoint(x:(_endPoint.x - _startPoint.x)/2, 
             y:(_endPoint.y - _startPoint.y)/2) 

       let normalizedDistance = myDistance/dragDistance 
       let normalizedImpact = (cos(normalizedDistance * .pi) + 1)/2 

       vertex.to.x += maxDistort.x * normalizedImpact * hProtection 
       vertex.to.y += maxDistort.y * normalizedImpact * vProtection 

       mesh.replaceVertex(at: i, with: vertex) 
      } 
     } 
     return mesh 
    } 
} 

然后只需将属性设置为您的transformView。

fileprivate var startPoint:CGPoint? 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     guard let touch = touches.first else { return } 
     startPoint = touch.location(in: self) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     guard let startPoint_ = startPoint else { return } 
     guard let touch = touches.first else { return } 

     let position = touch.location(in: self) 
     transformView.meshTransform = BCMutableMeshTransform.warpTransform(from: startPoint_, 
                      to: position, in: bounds.size) 
    } 

该warp代码并不完美,但它在我的情况下完成工作。你可以玩它,但一般的想法保持不变。