<h3>引言</h3>
生成二維碼的步驟
導(dǎo)入CoreImage框架
通過(guò)濾鏡CIFilter生成二維碼
<h4>生成普通的二維碼</h4>
<pre>/** 生成一張普通的二維碼 */
+(UIImage )QRcodeToolgeneratedDataString:(NSString )dataString
imageViewWidth:(CGFloat)imageViewWidth;</pre>
創(chuàng)建生成二維碼的類方法
<pre>/
生成一個(gè)普通的二維碼
@param dataString 傳入要生成二維碼的數(shù)據(jù)
@param imageViewWidth 圖片的寬度
*/
+(UIImage *)QRcodeToolgeneratedDataString:(NSString *)dataString
imageViewWidth:(CGFloat)imageViewWidth
{
//通過(guò)濾鏡CIFilter生成二維碼
//1.創(chuàng)建過(guò)濾器
CIFilter *filter=[CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復(fù)默認(rèn)
[filter setDefaults];
// 3.給過(guò)濾器添加數(shù)據(jù)
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
// 4.通過(guò)KVO設(shè)置濾鏡inputMessage數(shù)據(jù)
[filter setValue:data forKeyPath:@"inputMessage"];
// 4.獲取輸出的二維碼
CIImage *outputImage = [filter outputImage];
return [QRcodeTool createNonInterpolatedUIImageFormCIImage:outputImage withSize:imageViewWidth];
}
</pre>
根據(jù)CIImage生成指定大小的UIImage
<pre>/** 根據(jù)CIImage生成指定大小的UIImage */
-
(UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 1.創(chuàng)建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
// 2.保存bitmap到圖片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);return [UIImage imageWithCGImage:scaledImage];
}
</pre>
生成一張帶有l(wèi)ogo的二維碼
<pre>
/**
生成一張帶有l(wèi)ogo的二維碼
@param dataString 傳入要生成二維碼的數(shù)據(jù)
@param logoimageName 圖片名字
@param logoScale logo相對(duì)于父視圖的縮放比(取值范圍:0-1取募,0供填,代表不顯示脓魏,1,代表與父視圖大小相同)
*/
+(UIImage *)QRcodeToolgeneratedLogoDataString:(NSString *)dataString
logoimageName:(NSString *)logoimageName
logoScale:(CGFloat)logoScale
{
// 1觅廓、創(chuàng)建濾鏡對(duì)象
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 恢復(fù)濾鏡的默認(rèn)屬性
[filter setDefaults];
// 2、設(shè)置數(shù)據(jù)
NSString *string_data = dataString;
// 將字符串轉(zhuǎn)換成 NSdata (雖然二維碼本質(zhì)上是字符串, 但是這里需要轉(zhuǎn)換, 不轉(zhuǎn)換就崩潰)
NSData *qrImageData = [string_data dataUsingEncoding:NSUTF8StringEncoding];
// 設(shè)置過(guò)濾器的輸入值, KVC賦值
[filter setValue:qrImageData forKey:@"inputMessage"];
// 3涵但、獲得濾鏡輸出的圖像
CIImage *outputImage = [filter outputImage];
// 圖片小于(27,27),我們需要放大
outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(20, 20)];
// 4杈绸、將CIImage類型轉(zhuǎn)成UIImage類型
UIImage *start_image = [UIImage imageWithCIImage:outputImage];
// - - - - - - - - - - - - - - - - 添加中間小圖標(biāo) - - - - - - - - - - - - - - - -
// 5、開啟繪圖, 獲取圖形上下文 (上下文的大小, 就是二維碼的大小)
UIGraphicsBeginImageContext(start_image.size);
// 把二維碼圖片畫上去 (這里是以圖形上下文, 左上角為(0,0)點(diǎn)
[start_image drawInRect:CGRectMake(0, 0, start_image.size.width, start_image.size.height)];
// 再把小圖片畫上去
NSString *icon_imageName = logoimageName;
UIImage *icon_image = [UIImage imageNamed:icon_imageName];
CGFloat icon_imageW = start_image.size.width * logoScale;
CGFloat icon_imageH = start_image.size.height * logoScale;
CGFloat icon_imageX = (start_image.size.width - icon_imageW) * 0.5;
CGFloat icon_imageY = (start_image.size.height - icon_imageH) * 0.5;
[icon_image drawInRect:CGRectMake(icon_imageX, icon_imageY, icon_imageW, icon_imageH)];
// 6矮瘟、獲取當(dāng)前畫得的這張圖片
UIImage *final_image = UIGraphicsGetImageFromCurrentImageContext();
// 7瞳脓、關(guān)閉圖形上下文
UIGraphicsEndImageContext();
return final_image;
}</pre>
生成一張彩色的二維碼
<pre>+ (UIImage *)QRcodeToolgeneratedDataString:(NSString *)data backgroundColor:(CIColor *)backgroundColor mainColor:(CIColor *)mainColor
{
// 1、創(chuàng)建濾鏡對(duì)象
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 恢復(fù)濾鏡的默認(rèn)屬性
[filter setDefaults];
// 2澈侠、設(shè)置數(shù)據(jù)
NSString *string_data = data;
// 將字符串轉(zhuǎn)換成 NSdata (雖然二維碼本質(zhì)上是字符串, 但是這里需要轉(zhuǎn)換, 不轉(zhuǎn)換就崩潰)
NSData *qrImageData = [string_data dataUsingEncoding:NSUTF8StringEncoding];
// 設(shè)置過(guò)濾器的輸入值, KVC賦值
[filter setValue:qrImageData forKey:@"inputMessage"];
// 3劫侧、獲得濾鏡輸出的圖像
CIImage *outputImage = [filter outputImage];
// 圖片小于(27,27),我們需要放大
outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
// 4、創(chuàng)建彩色過(guò)濾器(彩色的用的不多)
CIFilter * color_filter = [CIFilter filterWithName:@"CIFalseColor"];
// 設(shè)置默認(rèn)值
[color_filter setDefaults];
// 5哨啃、KVC 給私有屬性賦值
[color_filter setValue:outputImage forKey:@"inputImage"];
// 6烧栋、需要使用 CIColor
[color_filter setValue:backgroundColor forKey:@"inputColor0"];
[color_filter setValue:mainColor forKey:@"inputColor1"];
// 7、設(shè)置輸出
CIImage *colorImage = [color_filter outputImage];
return [UIImage imageWithCIImage:colorImage];
}
</pre>
<h4>圖片效果</h4>
<h3>Github地址:https://github.com/jwh1650715313/QRcode</h3>