使用iOS原生的CIFilter生成二維碼和條形碼

使用CIFilter可以不引入任何第三方庫,就可以生成想要的二維碼和條形碼,今天簡單的介紹一下使用CIFilter生成二維碼和條形碼。系統(tǒng)CIFilter生成的二維碼和條形碼的大小有時(shí)并不能滿足需求,直接使用起來,二維碼圖片看起來有些模糊,這就需要我們手動(dòng)的根據(jù)目標(biāo)大小重新生成清晰的二維碼和條形碼。

1.生成二維碼(iOS7.0以上支持)

/**
 *  生成二維碼
 */
- (IBAction)generateQRCode:(id)sender {
    CIImage *ciImage = [self generateQRCodeImage:@"http://www.baidu.com"];
    _qRCodeImageView.image = [self resizeCodeImage:ciImage withSize:CGSizeMake(200, 200)];
}
/**
 *  二維碼圖片
 *
 *  @param source
 *
 *  @return CIImage 對(duì)象
 */
- (CIImage *)generateQRCodeImage:(NSString *)source
{
    NSData *data = [source dataUsingEncoding:NSUTF8StringEncoding];
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [filter setValue:data forKey:@"inputMessage"];
    [filter setValue:@"Q" forKey:@"inputCorrectionLevel"];
    
    return filter.outputImage;
}```
**2. 生成條形碼 (iOS8.0以上 支持)**

/**

  • 生成條形碼
    */
  • (IBAction)generateBarCode:(id)sender {
    CIImage ciImage = [self generateBarCodeImage:@"1234567890"];
    UIImage image = [self resizeCodeImage:ciImage withSize:CGSizeMake((self.view.frame.size.width - 80), 80)];
    _barCodeImageView.image = image;
    }
    /
  • 生成條形碼
  • @param source
  • @return 生成條形碼的CIImage對(duì)象
    */
  • (CIImage *) generateBarCodeImage:(NSString *)source
    {
    // iOS 8.0以上的系統(tǒng)才支持條形碼的生成,iOS8.0以下使用第三方控件生成
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
    // 注意生成條形碼的編碼方式
    NSData *data = [source dataUsingEncoding: NSASCIIStringEncoding];
    CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
    [filter setValue:data forKey:@"inputMessage"];
    // 設(shè)置生成的條形碼的上,下,左,右的margins的值
    [filter setValue:[NSNumber numberWithInteger:0] forKey:@"inputQuietSpace"];
    return filter.outputImage;
    }else{
    return nil;
    }
    }
**3. 生成自定義的二維碼和條形碼的大小**

/**

  • 調(diào)整生成的圖片的大小
  • @param image CIImage對(duì)象
  • @param size 需要的UIImage的大小
  • @return size大小的UIImage對(duì)象
    */
  • (UIImage *) resizeCodeImage:(CIImage *)image withSize:(CGSize)size
    {
    if (image) {
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scaleWidth = size.width/CGRectGetWidth(extent);
    CGFloat scaleHeight = size.height/CGRectGetHeight(extent);
    size_t width = CGRectGetWidth(extent) * scaleWidth;
    size_t height = CGRectGetHeight(extent) * scaleHeight;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
    CGContextRef contentRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef imageRef = [context createCGImage:image fromRect:extent];
    CGContextSetInterpolationQuality(contentRef, kCGInterpolationNone);
    CGContextScaleCTM(contentRef, scaleWidth, scaleHeight);
    CGContextDrawImage(contentRef, extent, imageRef);
    CGImageRef imageRefResized = CGBitmapContextCreateImage(contentRef);
    CGContextRelease(contentRef);
    CGImageRelease(imageRef);
    return [UIImage imageWithCGImage:imageRefResized];
    }else{
    return nil;
    }
    }
**4.運(yùn)行結(jié)果**

![二維碼和條形碼.png](http://upload-images.jianshu.io/upload_images/2167500-7bd611cb84c3165a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

以上就是使用iOS系統(tǒng)原生的CIFilter生成二維碼和條形碼,對(duì)于生成二維碼和條形碼時(shí),CIFilter的參數(shù)的定義可以參考官方文檔。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于二維碼(或者條形碼,以下歸類簡稱二維碼)掃描和生成的,我相信網(wǎng)絡(luò)上相關(guān)的文章層數(shù)不窮,但是,大部分都是直接粘貼...
    FR_Zhang閱讀 6,959評(píng)論 10 42
  • 不得不說,二維碼是小日本的一個(gè)偉大發(fā)明,它密度小、信息容量大、容錯(cuò)能力強(qiáng)、成本低、制作難度低等優(yōu)點(diǎn),使得二維碼得到...
    杰森_Jason閱讀 5,828評(píng)論 8 10
  • 模態(tài)窗口、疊加窗口、對(duì)話框、無論你叫它們什么,是時(shí)候重溫這個(gè)UI模式了。當(dāng)它們第一次來到現(xiàn)場(chǎng),模態(tài)窗口是一個(gè)優(yōu)雅的...
    SKYUI閱讀 1,009評(píng)論 1 3
  • 什么時(shí)候越喝越熱? 早上燒開水,倒了杯喝著溫。 喝完再倒?jié)M,比上杯熱了許多。 思考:顯然不是魔術(shù),因?yàn)榈谝槐镉凶?..
    在路上走著看天空閱讀 295評(píng)論 0 0
  • 每個(gè)人對(duì)青春的解讀也許都不一樣,我想不管年齡多大,有一顆努力向上的心,就是正青春。 圖一拍攝的是準(zhǔn)備今晚節(jié)目表演的...
    淡_淡閱讀 299評(píng)論 0 0

友情鏈接更多精彩內(nèi)容