美文网首页
生成二维码(中间带图片)

生成二维码(中间带图片)

作者: 白色天空729 | 来源:发表于2018-06-11 10:40 被阅读5次

    引用:https://www.jianshu.com/p/357c6477edf2

    使用:

            qrCodeImageView = UIImageView.init(frame: CGRect.init(x: 0, y: 100, width: 200, height: 200))
            qrCodeImageView.backgroundColor = UIColor.green
            view.addSubview(qrCodeImageView)
        
            qrCodeImageView.image = CreateQrcodeTool.shared.setupQRCodeImage("https://www.jianshu.com/u/01b7a2dd26e8", image: UIImage.init(named: ""))
    

    实现:

    class CreateQrcodeTool  : NSObject {
    
        static let shared: CreateQrcodeTool = {
            let timer = CreateQrcodeTool()
            return timer
        }()
        
        //MARK: -传进去字符串,生成二维码图片
         func setupQRCodeImage(_ text: String, image: UIImage?) -> UIImage {
            //创建滤镜
            let filter = CIFilter(name: "CIQRCodeGenerator")
            filter?.setDefaults()
            //将url加入二维码
            filter?.setValue(text.data(using: String.Encoding.utf8), forKey: "inputMessage")
            //取出生成的二维码(不清晰)
            if let outputImage = filter?.outputImage {
                //生成清晰度更好的二维码
                let qrCodeImage = setupHighDefinitionUIImage(outputImage, size: 300)
                //如果有一个头像的话,将头像加入二维码中心
                if var image = image {
                    //给头像加一个白色圆边(如果没有这个需求直接忽略)
                    image = circleImageWithImage(image, borderWidth: 50, borderColor: UIColor.white)
                    //合成图片
                    let newImage = syntheticImage(qrCodeImage, iconImage: image, width: 100, height: 100)
                    
                    return newImage
                }
                
                return qrCodeImage
            }
            
            return UIImage()
        }
        
        //image: 二维码 iconImage:头像图片 width: 头像的宽 height: 头像的宽
        private func syntheticImage(_ image: UIImage, iconImage:UIImage, width: CGFloat, height: CGFloat) -> UIImage{
            //开启图片上下文
            UIGraphicsBeginImageContext(image.size)
            //绘制背景图片
            image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
            
            let x = (image.size.width - width) * 0.5
            let y = (image.size.height - height) * 0.5
            iconImage.draw(in: CGRect(x: x, y: y, width: width, height: height))
            //取出绘制好的图片
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            //关闭上下文
            UIGraphicsEndImageContext()
            //返回合成好的图片
            if let newImage = newImage {
                return newImage
            }
            return UIImage()
        }
        
        //MARK: - 生成高清的UIImage
        private func setupHighDefinitionUIImage(_ image: CIImage, size: CGFloat) -> UIImage {
            let integral: CGRect = image.extent.integral
            let proportion: CGFloat = min(size/integral.width, size/integral.height)
            
            let width = integral.width * proportion
            let height = integral.height * proportion
            let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceGray()
            let bitmapRef = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: 0)!
            
            let context = CIContext(options: nil)
            let bitmapImage: CGImage = context.createCGImage(image, from: integral)!
            
            bitmapRef.interpolationQuality = CGInterpolationQuality.none
            bitmapRef.scaleBy(x: proportion, y: proportion);
            bitmapRef.draw(bitmapImage, in: integral);
            let image: CGImage = bitmapRef.makeImage()!
            return UIImage(cgImage: image)
        }
        
        //生成边框
        func circleImageWithImage(_ sourceImage: UIImage, borderWidth: CGFloat, borderColor: UIColor) -> UIImage {
            let imageWidth = sourceImage.size.width + 2 * borderWidth
            let imageHeight = sourceImage.size.height + 2 * borderWidth
            
            UIGraphicsBeginImageContextWithOptions(CGSize(width: imageWidth, height: imageHeight), false, 0.0)
            UIGraphicsGetCurrentContext()
            
            let radius = (sourceImage.size.width < sourceImage.size.height ? sourceImage.size.width:sourceImage.size.height) * 0.5
            let bezierPath = UIBezierPath(arcCenter: CGPoint(x: imageWidth * 0.5, y: imageHeight * 0.5), radius: radius, startAngle: 0, endAngle: .pi * 2, clockwise: true)
            bezierPath.lineWidth = borderWidth
            borderColor.setStroke()
            bezierPath.stroke()
            bezierPath.addClip()
            sourceImage.draw(in: CGRect(x: borderWidth, y: borderWidth, width: sourceImage.size.width, height: sourceImage.size.height))
            
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            
            return image!
        }
    }
    
    

    效果:


    image.png

    相关文章

      网友评论

          本文标题:生成二维码(中间带图片)

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