蘋果原生二維碼掃描和生成

最近項目需求需要用到掃描遂簡單的寫了一下到時候好直接調(diào)用。廢話不多說直接貼代碼了。

?二維碼生成

/**

?創(chuàng)建簡易二維碼

?@param content 數(shù)據(jù)

?@return image

?*/

+ (UIImage*)createQRCodeImageWithContent:(NSString*)content

{

? ? // 1. 創(chuàng)建一個二維碼濾鏡實例(CIFilter)

? ? CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

? ? ? ? // 濾鏡恢復(fù)默認設(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);

? ? ? ? //遍歷像素, 改變像素點顏色

? ? 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)建帶圖標二維碼

?@param content 數(shù)據(jù)

?@param iconImage 小圖標

?@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)點

? ? [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;

}

?二維碼掃描

我也是看別人寫的然后整理整理,代碼太多貼出來會很亂,有需要可以看看demo。

鏈接: https://pan.baidu.com/s/12cxTORXYze373knHVqeDOA 密碼: gzkq

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容