IOS 创建彩色二维码实例详解
IOS创建彩色二维码
因为系统创建的二维码默认都是黑色的,所以突然想改变一下二维码颜色,具体操作有点复杂,而且其中用到了好多C语言的语法,Swift不好写,所以默认用了OC。只贴了.m文件的代码,.h文件就是几个类函数的声明。
#import"UIImage+CreateQRCode.h" @implementationUIImage(CreateQRCode) +(UIImage*)createQRCode:(NSString*)stringandSize:(CGSize)sizeandColor:(UIColor*)color{ UIImage*qrcode=[selfcreateNonInterpolatedUIImageFormCIImage:[selfcreateQRForString:string]withSize:size]; constCGFloat*_components=CGColorGetComponents(color.CGColor); CGFloatred=_components[0]*255.f; CGFloatgreen=_components[1]*255.f; CGFloatblue=_components[2]*255.f; return[selfimageBlackToTransparent:qrcodewithRed:redandGreen:greenandBlue:blue]; } +(void)setImageViewShadow:(UIImageView*)view{ view.layer.shadowOffset=CGSizeMake(0,2); view.layer.shadowRadius=2; view.layer.shadowColor=[UIColorblackColor].CGColor; view.layer.shadowOpacity=0.5; view.backgroundColor=[UIColorclearColor]; } #pragmamark-创建灰度图,只有灰度图才能改变颜色 +(UIImage*)createNonInterpolatedUIImageFormCIImage:(CIImage*)imagewithSize:(CGSize)size{ CGRectextent=CGRectIntegral(image.extent); CGFloatscale=MIN(size.width/CGRectGetWidth(extent),size.height/CGRectGetHeight(extent)); size_twidth=CGRectGetWidth(extent)*scale; size_theight=CGRectGetHeight(extent)*scale; //iOS不支持设备依赖颜色空间或通用颜色空间。iOS应用程序必须使用设备颜色空间 //设备颜色空间主要用于IOS应用程序,因为其它颜色空间无法在IOS上使用。大多数情况下,MacOSX应用程序应使用通用颜色空间,而不使用设备颜色空间。 //CGColorSpaceCreateDeviceGray:创建设备依赖灰度颜色空间 //CGColorSpaceCreateDeviceRGB:创建设备依赖RGB颜色空间 //CGColorSpaceCreateDeviceCMYK:创建设备依赖CMYK颜色空间 CGColorSpaceRefcs=CGColorSpaceCreateDeviceGray();//这个是改变二维码颜色的主要属性,必须是灰度空间,作用是将UIImage转变成了灰度图 CGContextRefbitmapRef=CGBitmapContextCreate(NULL,width,height,8,0,cs,kCGImageAlphaNone); CIContext*context=[CIContextcontextWithOptions:NULL]; CGImageRefbitmapImage=[contextcreateCGImage:imagefromRect:extent]; CGContextSetInterpolationQuality(bitmapRef,kCGInterpolationHigh); CGContextScaleCTM(bitmapRef,scale,scale); CGContextDrawImage(bitmapRef,extent,bitmapImage); CGImageRefscaledImage=CGBitmapContextCreateImage(bitmapRef); CGContextRelease(bitmapRef); CGImageRelease(bitmapImage); return[UIImageimageWithCGImage:scaledImage]; } #pragmamark-创建二维码的主要代码 +(CIImage*)createQRForString:(NSString*)qrString{ NSData*stringData=[qrStringdataUsingEncoding:NSUTF8StringEncoding]; CIFilter*qrFilter=[CIFilterfilterWithName:@"CIQRCodeGenerator"]; [qrFiltersetValue:stringDataforKey:@"inputMessage"]; [qrFiltersetValue:@"M"forKey:@"inputCorrectionLevel"]; returnqrFilter.outputImage; } #pragmamark-改变二维码的颜色 voidProviderReleaseData(voidvoid*info,constvoidvoid*data,size_tsize){ free((void*)data); } +(UIImage*)imageBlackToTransparent:(UIImage*)imagewithRed:(CGFloat)redandGreen:(CGFloat)greenandBlue:(CGFloat)blue{ constintimageWidth=image.size.width; constintimageHeight=image.size.height; size_tbytesPerRow=imageWidth*4; uint32_t*rgbImageBuf=(uint32_t*)malloc(bytesPerRow*imageHeight); CGColorSpaceRefcolorSpace=CGColorSpaceCreateDeviceRGB(); CGContextRefcontext=CGBitmapContextCreate(rgbImageBuf,imageWidth,imageHeight,8,bytesPerRow,colorSpace, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast); CGContextDrawImage(context,CGRectMake(0,0,imageWidth,imageHeight),image.CGImage); intpixelNum=imageWidth*imageHeight; uint32_t*pCurPtr=rgbImageBuf; for(inti=0;i<pixelNum;i++,pCurPtr++){ if((*pCurPtr&0xFFFFFF00)<0x99999900){ uint8_t*ptr=(uint8_t*)pCurPtr; ptr[3]=red;//0~255 ptr[2]=green; ptr[1]=blue; }else{ uint8_t*ptr=(uint8_t*)pCurPtr; ptr[0]=0; } } CGDataProviderRefdataProvider=CGDataProviderCreateWithData(NULL,rgbImageBuf,bytesPerRow*imageHeight,ProviderReleaseData); CGImageRefimageRef=CGImageCreate(imageWidth,imageHeight,8,32,bytesPerRow,colorSpace, kCGImageAlphaLast|kCGBitmapByteOrder32Little,dataProvider, NULL,true,kCGRenderingIntentDefault); CGDataProviderRelease(dataProvider); UIImage*resultUIImage=[UIImageimageWithCGImage:imageRef]; CGImageRelease(imageRef); CGContextRelease(context); CGColorSpaceRelease(colorSpace); returnresultUIImage; } @end
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!