您的位置:首页 > 移动开发 > IOS开发

iOS二维码生成

2015-12-25 00:00 447 查看
摘要: 二维码的生成,中间附带小图标

使用CIFilter生成二维码

- (void)viewDidLoad {
//这里的参数str是你二维码所要存储的内容,一般是一个网络链接,也可以是各种信息
UIImage *image = [self QRFromString:@"你的string"];
//这个方法是通过输入rgb三基色来得到你想要的二维码的颜色
UIImage *imageChange = [self imageBlackToTransparent:image withRed:55 andGreen:167 andBlue:67];
//由于通过CIFilter生成的二维码非常模糊,通过缩放比例来增加清晰度
imageView.image = [self image:imageChange scale:10];

}

- (UIImage *)QRFromString:(NSString *)string {
//1. 需要生成二维码的内容
NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding ];
//2. 二维码生成器
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//3. 设置输入参数
[filter setValue:stringData forKey:@"inputMessage"];
//4. 设置识别率
[filter setValue:@"M" forKey:@"inputCorrectionLevel"];

//5. 获取生成的图片
CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:[filter outputImage] fromRect:[[filter outputImage] extent]];

return [UIImage imageWithCGImage:cgImage];
}

- (UIImage *)image:(UIImage *)image scale:(CGFloat)scale {
CGSize size = image.size;

//1. 缩放图片,使生成的二维码变得更清晰
UIGraphicsBeginImageContext(CGSizeMake(size.width * scale, size.width * scale));
CGContextRef context = UIGraphicsGetCurrentContext();
//2. 插值
CGContextSetInterpolationQuality(context, kCGInterpolationNone);
//3. 绘制图片
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), image.CGImage);
//4. 获取图片
UIImage *preImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//5. 旋转图片
UIImage *qrImage = [UIImage imageWithCGImage:[preImage CGImage]
scale:[preImage scale]
orientation:UIImageOrientationDownMirrored];
return qrImage;
}

void ProviderReleaseData (void *info, const void *data, size_t size){
free((void*)data);
}

- (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue{
const int imageWidth = image.size.width;
const int imageHeight = image.size.height;
size_t      bytesPerRow = imageWidth * 4;
uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
// 遍历像素
int pixelNum = imageWidth * imageHeight;
uint32_t* pCurPtr = rgbImageBuf;
for (int i = 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;
}
}
// 输出图片
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace,
kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
// 清理空间
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return resultUIImage;
}

通过上面的代码已经可以生成普通的二维码了,如果就需要黑白的二维码,可以去掉对二维码颜色的处理,如果中间需要加上一个小图标什么的直接覆盖就是了,因为二维码本身是有容错几率的,如果需要给二位码添加阴影使得看起来更加真实可以这样设置:

imageView.layer.shadowOffset = CGSizeMake(0, 0.2);  // 设置阴影的偏移量
imageView.layer.shadowRadius = 2;  // 设置阴影的半径
imageView.layer.shadowColor = [UIColor blackColor].CGColor; // 设置阴影的颜色
imageView.layer.shadowOpacity = 0.4; // 设置阴影的透明度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: