ios - 使用平移、旋转和捏合手势编辑后如何保存 UIImage

标签 ios swift uiimage core-image uigraphicscontext

我正在尝试使用 UIPanGesture、UIRotateGesture 和 UIPinchGesture 来实现编辑图像。编辑后,我希望保存编辑后的 ​​UIImage。

我已完成编辑图像功能。

但我不知道如何保存完全像原生iOS Camera App。

Pan Gesture 工作正常。

我的问题是旋转和缩放。

如何设置UIImage的中心 anchor ?

当我从转换信息中保存 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 + Swift 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

最佳答案

我有一个名为 myView 的具有透明背景的 UIIView,我将 UIImageView 作为 subview 添加到 myView 中,然后我在 myView 上应用 UIRotationGestureRecognizer,以便在此处旋转我的图像是我的 UIRotationGestureRecognizer 的 @IBAction 函数....

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

关于ios - 使用平移、旋转和捏合手势编辑后如何保存 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645731/

相关文章:

ios - NSData contentsOfUrl 返回 nil

ios在uiimageview中添加填充,所以一些背景显示

javascript - 有没有办法在触发 onclick 时禁用 iPad/iPhone 上的闪光灯/闪烁?

iOS:一些应用程序似乎绕过了 NEPacketTunnelProvider。如何执行?

arrays - 索引 0 超出空数组的范围,有时有效,有时无效

ios - 使用 Swift 以编程方式加载图像

ios - Xamarin iOS UIView 没有 DrawLayer 覆盖

ios - iPhone X 上的 React Native 底部选项卡被隐藏

ios - 删除带动画的 UITableViewCell(错误/崩溃)

ios - 可变参数 v 数组参数