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

2019-07-26  本文已影响0人  大神风格化X

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

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大小,第二个就是外边传入的旋转偏移量,有了这两个参数,裁剪过后图片不会发生任何变形,偏转。。。能够帮到各位最好,下次再见👋

上一篇下一篇

猜你喜欢

热点阅读