2017-10-09 95 views
1

我试图使用UIPanGesture,UIRotateGesture和UIPinchGesture来实现编辑图像。编辑完成后,我希望保存已编辑的UIImage。如何使用平移,旋转和捏手势编辑后保存UIImage

我完成了编辑图像功能。

但我不知道如何保存完全像本机iOS相机应用程序一样完美。

Pan手势工作正常。

我的问题是旋转和缩放。

如何设置UIImage的中心定位点?

当我从转换信息保存的UIImage然后UIImage的结果看起来是不同的,因为旋转和缩放,那么它总是采用基于(0,0)

@IBAction func showEditedImage(_ sender: Any) { 


     let image = preview.image! 
     var drawingRect : CGRect = CGRect.zero 
     drawingRect.size = preview.frame.size 

     let scale = transformedImg.frame.width/(preview.image?.size.width)! 
     let height = (preview.image?.size.height)! * scale 

     UIGraphicsBeginImageContextWithOptions(CGSize(width: transformedImg.frame.width, height: height), false, 0) 

     let context = UIGraphicsGetCurrentContext() 
     context!.concatenate(preview.transform) 

     image.draw(in: CGRect(x: 0, y: 0, width: transformedImg.frame.width, height: height)) 
     resultsImg = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 

     transformedImg.image = resultsImg 
    } 

这里是我的所有代码。

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet weak var preview: UIImageView! 
    @IBOutlet weak var frame: UIView! 
    @IBOutlet weak var transformedImg: UIImageView! 

    //save edited image 
    var resultsImg : UIImage! 

    override func viewDidLoad() { 

     resultsImg = UIImage() 
     super.viewDidLoad() 
    } 


     @IBAction func showEditedImage(_ sender: Any) { 


    let image = preview.image! 
    var drawingRect : CGRect = CGRect.zero 
    drawingRect.size = preview.frame.size 

    let scale = transformedImg.frame.width/(preview.image?.size.width)! 
    let height = (preview.image?.size.height)! * scale 

    UIGraphicsBeginImageContextWithOptions(CGSize(width: transformedImg.frame.width, height: height), false, 0) 

    let context = UIGraphicsGetCurrentContext() 
    context!.concatenate(preview.transform) 

    image.draw(in: CGRect(x: 0, y: 0, width: transformedImg.frame.width, height: height)) 
    resultsImg = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext(); 

    transformedImg.image = resultsImg 
} 

    @IBAction func pinchaction(_ sender: UIPinchGestureRecognizer) { 

     preview.transform = preview.transform.scaledBy(x: sender.scale, y: sender.scale) 

     sender.scale = 1 
    } 

    @IBAction func rotateaction(_ sender: UIRotationGestureRecognizer) { 

     let rotate = sender.rotation 
     preview.transform = preview.transform.rotated(by: rotate) 


     sender.rotation = 0 

    } 

    @IBAction func panaction(_ sender: UIPanGestureRecognizer) { 

     let points = sender.translation(in: self.frame) 
     preview.transform = preview.transform.translatedBy(x: points.x, y: points.y) 

     let translatedCenter = CGPoint(x:self.frame.center.x + points.x, y:self.frame.center.y + points.y) 

     sender.setTranslation(CGPoint.zero, in: self.frame) 

    } 



} 

环境:XCode9 +斯威夫特4

更新2017年10月14日

我解决我的问题

@IBAction func showEditedImage(_ sender: Any) { 

     let image = preview.image! 
     var drawingRect : CGRect = CGRect.zero 
     drawingRect.size = preview.frame.size 

     let scale = transformedImg.frame.width/(preview.image?.size.width)! 
     let height = (preview.image?.size.height)! * scale 


     UIGraphicsBeginImageContextWithOptions(CGSize(width: transformedImg.frame.width, height: height), false, 0) 

     let context = UIGraphicsGetCurrentContext() 

     //Set Center Position before Scale, Rotate Image 
     context?.translateBy(x: transformedImg.frame.width/2, y: height/2) 

     //Applied Translate, Scale, Rotate 
     context!.concatenate(preview.transform) 

     context?.translateBy(x: -(transformedImg.frame.width/2), y: -(height/2)) 

     image.draw(in: CGRect(x: 0, y: 0, width: transformedImg.frame.width, height: height)) 
     resultsImg = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 

     transformedImg.image = resultsImg 
    } 

enter image description here

回答

1

我有一个名为MyView的透明背景UIIView和我添加的UIImageView到MyView的作为子视图,然后我申请UIRotationGestureRecognizer上MyView的使这里旋转我的形象是UIRotationGestureRecognizer我@IBAction FUNC ....

@IBAction func rotateGesture(sender: UIRotationGestureRecognizer) { 
    if let view = sender.view { 
     view.transform = CGAffineTransformRotate(view.transform, sender.rotation) 
     sender.rotation = 0 
    } 
} 
+0

感谢你的代码帮助了我很多。 :) –

1

我实现雨燕2.3这个功能,所以你可以在Swift 4中使用它。

fun SaveImage() 
{ 
    if myImageView != nil 
    { 
     // You should hide here your Buttons,Labels, etc. 

    let layer = UIApplication.sharedApplication().keyWindow!.layer 
    let scale = UIScreen.mainScreen().scale 
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale); 

    layer.renderInContext(UIGraphicsGetCurrentContext()!) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

     // Now here you can UnHide(Show) your Buttons,Labels,etc 
    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil) 
    let alert = UIAlertView(title: "Alert !!", 
     message: "Your image has been saved to Photo Library", 
     delegate: nil, 
     cancelButtonTitle: "OK") 
    alert.show() 

    } 
    else 
    { 
     let alert = UIAlertView(title: "Alert !!", 
      message: "Please first Select/Capture Image", 
      delegate: nil, 
      cancelButtonTitle: "OK") 
     alert.show() 
    } 

} 
+0

感谢您的回复〜! –

+0

WellCome!这段代码对你有没有帮助? – Zee

+0

是的,你帮助我。谢谢但我的问题是如何将图像的原点设置为中心位置并使用变换方法旋转图像。我试图旋转变换,但它旋转基于图像的左上方不居中。 –