Swift UIKit/CoreGraphics 二维码添加logo

2018年12月12日更新。
最新又对Core Graphics 框架重新巩固一下,最重要一点:就是不要对底层框架盲目崇拜!愿意了解可以看看文档。它的绘制过程还是有用的!

Core Graphics框架基于Quartz高级绘图引擎。它提供低级,轻量级2D渲染,具有无与伦比的输出保真度。您可以使用此框架来处理基于路径的绘制,转换,颜色管理,屏幕外渲染,图案,渐变和阴影,图像数据管理,图像创建和图像蒙版,以及PDF文档创建,显示和解析。

修改原因,因为一个小伙伴咨询我贴图功能。寻找解决办法的时候!复习了一下。每次复习肯定都有新收获,当然需要你带着解决问题的目的去探索!

其实我们也没必要执着于CoreGraphics的使用,UIKit是在CoreGraphics上层的高级框架。我们对于这种简单的绘制。完全是UIKit几句话就能解决的。

/** 生成二维码中间添加logo
 - Parameters:
    - back: 二维码背景视图
    - icon: 头像
 */
func createQrcode(back: UIImage, with icon: UIImage) -> UIImage {
    let scale: CGFloat = 0.25 // 1/4的大小为最佳大小
    let size: CGSize = back.size
    let rect = CGRect.init(origin: .zero, size: size)
    UIGraphicsBeginImageContextWithOptions(size, true, 0)
    let context: CGContext = UIGraphicsGetCurrentContext()!
    print(context)
    back.draw(in: rect)
    
    let iconWidth: CGFloat = size.width*scale
    let iconHeight: CGFloat = size.height*scale
    
    let offset: CGPoint = CGPoint.init(x: rect.midX-iconWidth/2.0, y: rect.midY-iconHeight/2.0)
    var iconRect = rect.applying(CGAffineTransform.init(scaleX: scale, y: scale))
    iconRect.origin = offset
    let path = UIBezierPath.init(roundedRect: iconRect, cornerRadius: iconRect.height/10)
    path.addClip()
    
    icon.draw(in: iconRect)
    UIColor.black.setStroke()
    path.lineWidth = 6
    path.stroke()
    UIColor.init(white: 0.7, alpha: 1.0).setStroke()
    path.lineWidth = 4
    path.stroke()
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return image
}
// 测试部分
let qrcodeImg = UIImage.init(named: "qrcode.png")!
let iconImg: UIImage = UIImage.init(named: "icon.png")!

let image = createQrcode(back: qrcodeImg, with: iconImg)
let view = UIImageView.init(image: image)

使用UIKit 很方便,但是可能假如你不了解CoreGraphics的绘制过程的话。那可能这代码对你有所疑惑! OC的代码不建议你看了。所以我把它删掉了。哈哈

'! # ps:对于Context的任何操作只对之后的操作有效。并不影响当前已经绘制的操作!'

CoreData 现在使用觉着还可以。coretext:最后我也没怎么研究他的排版功能。但是我看TextKit了,简单排版足够。

2018.12.12 结束

···

最近在做二维码的一些相关操作,在网上找了好久,也没看到什么自己满意的二维码中间填充头像的功能,想着自己最近在看coreImage,还不如自己写一个了

希望能帮助到大家解决一些图片简单处理上的一些问题

那么准备好我们要着手开始弄了:

首先看一下过程。

Swift UIKit/CoreGraphics 二维码添加logo_第1张图片
过程->结果

那这个首先需要我们先去处理一下logo图片了

    在进行操作之前我们要进行一下二维码的一小部分知识的了解:
    二维码是支持容错的
   二维码容错率用字母表示,容错能力等级分为:L、M、Q、H四级:
* L  —— 7%
* M —— 15%
* Q —— 25%
* H —— 30%
Swift UIKit/CoreGraphics 二维码添加logo_第2张图片
红色区域才是二维码的数据存储区

所以二维码可以进行部分遮挡而不会影响 二维码的读取 以及读取速度

** `# 整体步骤: 1.一些必要的计算  -> 2.绘制最下层二维码 -> 3.裁切画布.  -> 4.绘制logo并绘制logo边框 -> 完成
...
    #看起来简单吧,绘制完成。`**


    ps _2_ : 因为CGContext是mac坐标系系统,而UIKit使用的是iPhone的绘制坐标系系统。 
    他们的起点是不一样的,所以绘制的时候需要把绘制原点重合在一起,才能进行准确的绘制。

我相信看到这里,也许能激起大家对IOS的深入学习的兴趣,IOS开发的强大需要大家一点点去挖掘, 其他语言能做的,iOS肯定也可以做,可能还会做的更好。 让我们一起去努力…… 最近看完coreText,coreData,还有sqlite之后。正在看二维码美化,有兴趣的可以交流一下,当然小弟知识有限,还希望大家多多指教

你可能感兴趣的:(Swift UIKit/CoreGraphics 二维码添加logo)