美文网首页
仿微信照片编辑器(swift-oc混合开发)

仿微信照片编辑器(swift-oc混合开发)

作者: 大神风格化X | 来源:发表于2019-07-26 17:16 被阅读0次

    项目中要求做一个仿微信编辑器。现在基本上实现了对应的功能,当然我这片文章不想概括所有,只是说说里面逻辑比较复杂的一块内容,那就是在图片进行裁剪过后,如何生成一张对应的图片。相关更多代码我会在之后的文章中给大家相应的展示。
    那么今天就来切入正题。像照片编辑这块逻辑,涉及到绘图(涂鸦)、马赛克涂抹、添加标签项、照片旋转以及裁剪。这些操作过后。这边会生成一个有图层、标签图层、马赛克图层的新照片。这几种情况的处理是比较简单的,关键复杂的就是照片经过裁剪页面的裁剪框及旋转过后,生成的新图片如何绘制到位。一下就是我所做的绘制操作代码,希望能给到用到这块的朋友带来方便:

    extension UIImage {
        func croppedImg(frame: CGRect, angle: Int, circular: Bool, _ layer: CALayer?) -> UIImage? {
            var croppedImg: UIImage?
            UIGraphicsBeginImageContextWithOptions(frame.size, true, screenScale)
            guard let context = UIGraphicsGetCurrentContext() else {return nil}
            if circular {
                context.addRect(CGRect(origin: CGPoint.zero, size: frame.size))
                context.clip()
            }
            if angle != 0 {
                let imageView = UIImageView(image: self)
                imageView.layer.minificationFilter = .nearest
                imageView.layer.magnificationFilter = .nearest
                let transFloat = CGFloat(angle) * CGFloat(Double.pi/180),
                transForm = CGAffineTransform(rotationAngle: transFloat)
                imageView.transform = transForm      
                let rotatedRect = imageView.bounds.applying(imageView.transform),
                containerView = UIView(frame: CGRect(origin: CGPoint.zero, size: rotatedRect.size))
                containerView.addSubview(imageView)
                imageView.center = containerView.center
                context.translateBy(x: -frame.origin.x, y: -frame.origin.y)
                containerView.layer.render(in: context)
            }else {
                context.translateBy(x: -frame.origin.x, y: -frame.origin.y)
                self.draw(at: CGPoint.zero)
            }
            if let layer = layer {
                layer.render(in: context)
            }
            croppedImg = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            guard let cgImg = croppedImg?.cgImage else {
                return nil
            }
            return UIImage(cgImage: cgImg, scale: 1, orientation: .up)
        }
    }
    

    就像我这段代码展示的一样,我当时操作是将image写了一个拓展方法,外部操作起来非常方便,需要外面传入两个参数。第一个就是对应的裁剪框的frame大小,第二个就是外边传入的旋转偏移量,有了这两个参数,裁剪过后图片不会发生任何变形,偏转。。。能够帮到各位最好,下次再见👋

    相关文章

      网友评论

          本文标题:仿微信照片编辑器(swift-oc混合开发)

          本文链接:https://www.haomeiwen.com/subject/mvpahctx.html