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
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!