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)系作者
  • 序言:七十年代末栈源,一起剝皮案震驚了整個濱河市挡爵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凉翻,老刑警劉巖了讨,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捻激,死亡現(xiàn)場離奇詭異,居然都是意外死亡前计,警方通過查閱死者的電腦和手機胞谭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來男杈,“玉大人丈屹,你說我怎么就攤上這事×姘簦” “怎么了旺垒?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肤无。 經(jīng)常有香客問我先蒋,道長,這世上最難降的妖魔是什么宛渐? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任竞漾,我火速辦了婚禮,結(jié)果婚禮上窥翩,老公的妹妹穿的比我還像新娘业岁。我一直安慰自己,他們只是感情好寇蚊,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布笔时。 她就那樣靜靜地躺著,像睡著了一般仗岸。 火紅的嫁衣襯著肌膚如雪允耿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天爹梁,我揣著相機與錄音右犹,去河邊找鬼提澎。 笑死姚垃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盼忌。 我是一名探鬼主播积糯,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谦纱!你這毒婦竟也來了看成?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤跨嘉,失蹤者是張志新(化名)和其女友劉穎川慌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡梦重,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年兑燥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琴拧。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡降瞳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚓胸,到底是詐尸還是另有隱情挣饥,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布沛膳,位于F島的核電站扔枫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锹安。R本人自食惡果不足惜茧吊,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望八毯。 院中可真熱鬧搓侄,春花似錦、人聲如沸话速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泊交。三九已至乳讥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廓俭,已是汗流浹背云石。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留研乒,地道東北人汹忠。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像雹熬,于是被迫代替她去往敵國和親宽菜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

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