2016-07-24 7 views
1

Я новый bie в IOS Image редактирование работы.Image Warp in IOS

Я хочу сделать функциональность Image Warp в ios или swift (любой).

Я ищу много прибегая к помощи, но не получить точное, что я хочу

ссылке ниже я searf

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

https://github.com/BradLarson/GPUImage

https://github.com/Ciechan/BCMeshTransformView

Вот изображение того, что я хочу (Когда я касаюсь изображения точки сетки, мы должны обернуть, и если я положу gri d точка на прежнем месте его должно быть оригинальным, как мудрый)

enter image description here

enter image description here

+0

Вероятно, вы не сможете найти то, что хотите, в качестве компонента, который вы можете скопировать/вставить в свой код. OpenGL - это продвинутый, труднодоступный API, и это то, что вам нужно для достижения вашей цели. Реально, у вас есть несколько месяцев обучения перед вами, прежде чем вы будете готовы заняться чем-то этим сложным. –

ответ

1

Взгляните на мой ответ на этот вопрос:

Warp \ bend effect on a UIView?

Вы также можете посмотреть на эта библиотека git:

https://github.com/Ciechan/BCMeshTransformView

Это может быть хорошей отправной точкой для того, что вы хотите сделать, но вам нужно узнать о OpenGL, матрицах трансформации, множестве других вещей.

Что вы спрашиваете, это довольно просто OpenGL. Вам просто нужно настроить полосу треугольника, которая описывает измененные точки сетки. Вы загрузили бы свое изображение как текстуру, а затем визуализировали текстуру с помощью треугольных полос.

Однако, «прямолинейный OpenGL» - это своего рода наука о ракете. Концепции высокого уровня могут быть простыми, но в конечном итоге возникает множество очень суетливых деталей, которые вы должны получить, чтобы заставить их работать.

Взгляните на это короткое видео я создал с моим приложением Face Dancer

Face Dancer video with grid lines

+0

Спасибо Дункан С за хороший ответ.и я действительно удивлен, что кто-то проголосовал за ответ. Если он знает более лучший ответ, то, пожалуйста, ответьте на вопрос, а затем проголосовали. – 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) 
    } 

Код деформации не идеален, но он выполняет свою работу в моем случае. Вы можете играть с ним, но общая идея остается прежней.