iOS 生成二维码

iOS7之后,可以使用原生的CIFilter创建二维码。

一、生成二维码

首先是二维码的生成,使用CIFilter很简单,直接传入生成二维码的字符串即可:

- (CIImage *)createQRForString:(NSString *)qrString {
    NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
    // 创建filter
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 设置内容和纠错级别
    [qrFilter setValue:stringData forKey:@"inputMessage"];
    [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
    // 返回CIImage
    return qrFilter.outputImage;
}

因为生成的二维码是一个CIImage,我们直接转换成UIImage的话大小不好控制,所以使用下面方法返回需要大小的UIImage:

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
   // 1.创建bitmap;
    size_t width = CGRectGetWidth(extent) * scale;
    size_t height = CGRectGetHeight(extent) * scale;
    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extent, bitmapImage);
    // 2.保存bitmap到图片
    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    CGContextRelease(bitmapRef);
    CGImageRelease(bitmapImage);
    //原图
    UIImage *outputImage = [UIImage imageWithCGImage:scaledImage];
    UIGraphicsBeginImageContextWithOptions(outputImage.size, NO, [[UIScreen mainScreen] scale]);
    [outputImage drawInRect:CGRectMake(0,0 , size, size)];
    //水印图
    UIImage *waterimage = [UIImage imageNamed:@"icon"];
    [waterimage drawInRect:CGRectMake((size-waterImagesize)/2.0, (size-waterImagesize)/2.0, waterImagesize, waterImagesize)];
    UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newPic;
}

设置图片透明度

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄 #import"SHCodeTableViewCe...
    石虎132阅读 672评论 0 17
  • 首先先了解一下二维码的容错(例如微信的二维码中间附带头像图片): 二维码都有一定的纠错,就是有部分污损或者破损都没...
    零零贰叁阅读 1,218评论 0 0
  • 自定义二维码,就是指给系统二维码添加一些图片(前景或者背景图片), 或者改变下颜色 自定义二维码实质是通过Quar...
    翻这个墙阅读 2,093评论 0 0
  • ZBar 应该没有 生成二维码的功能。正好之前班兽分享过一个生成二维码的功能 拿过来看看。首先添加依赖 然后 im...
    挠叔阅读 291评论 0 1
  • 去年过年的时候,朋友家被盗。天亮后看到满地狼藉和厨房窗户被掰弯的护栏,她急忙报了警。两个多小时候后,警察不紧不慢地...
    命自我立阅读 404评论 13 9