iOS 生成二維碼

iOS7之后,可以使用原生的CIFilter創(chuàng)建二維碼。

一、生成二維碼

首先是二維碼的生成,使用CIFilter很簡單,直接傳入生成二維碼的字符串即可:

- (CIImage *)createQRForString:(NSString *)qrString {
    NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
    // 創(chuàng)建filter
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 設(shè)置內(nèi)容和糾錯級別
    [qrFilter setValue:stringData forKey:@"inputMessage"];
    [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
    // 返回CIImage
    return qrFilter.outputImage;
}

因為生成的二維碼是一個CIImage,我們直接轉(zhuǎn)換成UIImage的話大小不好控制,所以使用下面方法返回需要大小的UIImage:

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
   // 1.創(chuàng)建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;
}

設(shè)置圖片透明度

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) { 
       // 改成下面的代碼,會將圖片轉(zhuǎn)成想要的顏色 
       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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 #import"SHCodeTableViewCe...
    石虎132閱讀 677評論 0 17
  • 首先先了解一下二維碼的容錯(例如微信的二維碼中間附帶頭像圖片): 二維碼都有一定的糾錯,就是有部分污損或者破損都沒...
    零零貳叁閱讀 1,224評論 0 0
  • 自定義二維碼,就是指給系統(tǒng)二維碼添加一些圖片(前景或者背景圖片), 或者改變下顏色 自定義二維碼實質(zhì)是通過Quar...
    翻這個墻閱讀 2,124評論 0 0
  • ZBar 應(yīng)該沒有 生成二維碼的功能。正好之前班獸分享過一個生成二維碼的功能 拿過來看看。首先添加依賴 然后 im...
    撓叔閱讀 293評論 0 1
  • 去年過年的時候,朋友家被盜。天亮后看到滿地狼藉和廚房窗戶被掰彎的護(hù)欄,她急忙報了警。兩個多小時候后,警察不緊不慢地...
    命自我立閱讀 415評論 13 9