2017-10-09 69 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

是的,你幫助我。謝謝但我的問題是如何將圖像的原點設置爲中心位置並使用變換方法旋轉圖像。我試圖旋轉變換,但它旋轉基於圖像的左上方不居中。 –