iOS 生成二维码

2016-06-30  本文已影响178人  _悟了个空

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;
}
上一篇下一篇

猜你喜欢

热点阅读