1. 程式人生 > >二維碼、條形碼生成

二維碼、條形碼生成

主角: CIFilter (濾鏡)

// 1.建立濾鏡
let filter = CIFilter(name: "CIQRCodeGenerator")
// 2.還原濾鏡的預設屬性
filter?.setDefaults()
// 3.設定需要生成二維碼的資料
filter?.setValue("二維碼".dataUsingEncoding(NSUTF8StringEncoding), forKey: "inputMessage")
// 4.從濾鏡中取出生成好的圖片
let ciImage = filter?.outputImage

建立濾鏡有個name屬性,”CIQRCodeGenerator” 則代表生成的標準二維碼 (QRCode) “CICode128BarcodeGenerator”則代表生成條形碼-更多想過標識資訊檢視這裡

但是這個時候取得的ciImage 轉換成UIImage並不清晰

打印出資訊可以發現 <UIImage: 0x7fea985f7220>, {23, 23}
大小隻有23 x 23…所以放大後會非常模糊,這個時候我們需要將其拉伸並保留原清晰度,具體如下

private func createNonInterpolatedUIImageFormCIImage(image: CIImage, size: CGFloat) -> UIImage {
// 獲得整數的x,y,width,height (取大)
let extent: CGRect = CGRectIntegral(image.extent)
let scale: CGFloat = min(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent))
// 1.建立bitmap;
let width = CGRectGetWidth(extent) * scale
let height = CGRectGetHeight(extent) * scale
// 獲得顏色空間
let cs: CGColorSpaceRef = CGColorSpaceCreateDeviceGray()!
// 獲取一個bitmap的CGContext
let bitmapRef = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, cs, 0)!
// 獲取一個CIContext
let context = CIContext(options: nil)
// 通過CIContext,使用CIImage,RECT 獲得CGImageRef
let bitmapImage: CGImageRef = context.createCGImage(image, fromRect: extent)
// CGContextSetInterpolationQuality設定下顏色質量等級為none
CGContextSetInterpolationQuality(bitmapRef, CGInterpolationQuality.None)
// 將獲得的CGImageRef進行拉伸
CGContextScaleCTM(bitmapRef, scale, scale);
// 將圖片畫出來
CGContextDrawImage(bitmapRef, extent, bitmapImage);
// 2.儲存bitmap到圖片
let scaledImage: CGImageRef = CGBitmapContextCreateImage(bitmapRef)!
return UIImage(CGImage: scaledImage)
}