最近項(xiàng)目需求需要用到掃描遂簡(jiǎn)單的寫了一下到時(shí)候好直接調(diào)用眶拉。廢話不多說直接貼代碼了区岗。
?二維碼生成
/**
?創(chuàng)建簡(jiǎn)易二維碼
?@param content 數(shù)據(jù)
?@return image
?*/
+ (UIImage*)createQRCodeImageWithContent:(NSString*)content
{
? ? // 1. 創(chuàng)建一個(gè)二維碼濾鏡實(shí)例(CIFilter)
? ? CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
? ? ? ? // 濾鏡恢復(fù)默認(rèn)設(shè)置
? ? [filtersetDefaults];
? ? ? ? // 2. 給濾鏡添加數(shù)據(jù)
? ? NSString*stringCurrent = string?string:@"are you ok?";
? ? NSData *data = [stringCurrent dataUsingEncoding:NSUTF8StringEncoding];
? ? [filtersetValue:dataforKeyPath:@"inputMessage"];
? ? ? ? // 3. 生成二維碼
? ? CIImage*image = [filteroutputImage];
? ? CGFloatsizeCurrent = size==0?100:size;
? ? CGRectextent =CGRectIntegral(image.extent);
? ? CGFloatscale =MIN(sizeCurrent/CGRectGetWidth(extent), sizeCurrent/CGRectGetHeight(extent));
? ? ? ? // 1.創(chuàng)建bitmap;
? ? size_twidth =CGRectGetWidth(extent) * scale;
? ? size_theight =CGRectGetHeight(extent) * scale;
? ? CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
? ? CGContextRefbitmapRef =CGBitmapContextCreate(nil, width, height,8,0, cs, (CGBitmapInfo)kCGImageAlphaNone);
? ? CIContext*context = [CIContextcontextWithOptions:nil];
? ? CGImageRefbitmapImage = [contextcreateCGImage:imagefromRect:extent];
? ? CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
? ? CGContextScaleCTM(bitmapRef, scale, scale);
? ? CGContextDrawImage(bitmapRef, extent, bitmapImage);
? ? CGImageRefscaledImage =CGBitmapContextCreateImage(bitmapRef);
? ? CGContextRelease(bitmapRef);
? ? CGImageRelease(bitmapImage);
? ? return[UIImageimageWithCGImage:scaledImage];
}
/**
?創(chuàng)建有顏色二維碼
?@param content 數(shù)據(jù)
?@param shadowColor 顏色值
?@return image
?*/
+ (UIImage*)createQRCodeImageWithContent:(NSString*)content ShadowColor:(UIColor*)shadowColor
{
constCGFloat*components =CGColorGetComponents(shadowColor.CGColor);
? ? CGFloatred? ? = components[0];
? ? CGFloatgreen? = components[1];
? ? CGFloatblue? ? = components[2];
? ?UIImage *image = [self createQRCodeImageWithString:content];
? ? intimageWidth = image.size.width;
? ? intimageHeight = image.size.height;
? ? size_tbytesPerRow = imageWidth *4;
? ? uint32_t*rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
? ? CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
? ? CGContextRefcontext =CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight,8, bytesPerRow, colorSpaceRef,kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast);
? ? CGContextDrawImage(context,CGRectMake(0,0, imageWidth, imageHeight), image.CGImage);
? ? ? ? //遍歷像素, 改變像素點(diǎn)顏色
? ? intpixelNum = imageWidth * imageHeight;
? ? uint32_t*pCurPtr = rgbImageBuf;
? ? for(inti =0; i
? ? ? ? if((*pCurPtr &0xFFFFFF00) <0x99999900) {
? ? ? ? ? ? uint8_t* ptr = (uint8_t*)pCurPtr;
? ? ? ? ? ? ptr[3] = red*255;
? ? ? ? ? ? ptr[2] = green*255;
? ? ? ? ? ? ptr[1] = blue*255;
? ? ? ? }else{
? ? ? ? ? ? uint8_t* ptr = (uint8_t*)pCurPtr;
? ? ? ? ? ? ptr[0] =0;
? ? ? ? }
? ? }
? ? //取出圖片
? ?CGDataProviderRefdataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight,ProviderReleaseData);
? ? CGImageRefimageRef =CGImageCreate(imageWidth, imageHeight,8,32, bytesPerRow, colorSpaceRef,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGImageAlphaLast|kCGBitmapByteOrder32Little, dataProvider,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,true,kCGRenderingIntentDefault);
? ? CGDataProviderRelease(dataProvider);
? ? UIImage*resultImage = [UIImageimageWithCGImage:imageRef];
? ? CGImageRelease(imageRef);
? ? CGContextRelease(context);
? ? CGColorSpaceRelease(colorSpaceRef);
}
voidProviderReleaseData (void*info,constvoid*data,size_tsize){
? ? free((void*)data);
}
/**
?創(chuàng)建帶圖標(biāo)二維碼
?@param content 數(shù)據(jù)
?@param iconImage 小圖標(biāo)
?@param size 二維碼大小
?@return image
?*/
+ (UIImage*)createQRCodeImageWithContent:(NSString*)content iconImage:(NSString*)iconImage size:(CGFloat)size
{
UIImage *image = [self createQRCodeImageWithString:content];
? ? ? ? // 5、開啟繪圖, 獲取圖形上下文 (上下文的大小, 就是二維碼的大小)
? ? UIGraphicsBeginImageContext(image.size);
? ? ? ? // 把二維碼圖片畫上去 (這里是以圖形上下文, 左上角為(0,0)點(diǎn)
? ? [imagedrawInRect:CGRectMake(0,0, image.size.width, image.size.height)];
? ? ? ? // 再把小圖片畫上去
? ? NSString*icon_imageName = iconImage;
? ? UIImage*icon_image = [UIImageimageNamed:icon_imageName];
? ? CGFloaticon_imageW = size/4;
? ? CGFloaticon_imageH = icon_imageW;
? ? CGFloaticon_imageX = (image.size.width- icon_imageW) *0.5;
? ? CGFloaticon_imageY = (image.size.height- icon_imageH) *0.5;
? ? [icon_imagedrawInRect:CGRectMake(icon_imageX, icon_imageY, icon_imageW, icon_imageH)];
? ? ? ? // 6、獲取當(dāng)前畫得的這張圖片
? ? UIImage *final_image = UIGraphicsGetImageFromCurrentImageContext();
? ? ? ? // 7烫映、關(guān)閉圖形上下文
? ? UIGraphicsEndImageContext();
? ? returnfinal_image;
}
?二維碼掃描
我也是看別人寫的然后整理整理,代碼太多貼出來會(huì)很亂噩峦,有需要可以看看demo锭沟。
鏈接: https://pan.baidu.com/s/12cxTORXYze373knHVqeDOA 密碼: gzkq