iOS - 原生的CIFilter產生二維碼和條碼

來源:互聯網
上載者:User

標籤:object   div   https   api   int   input   設定   nsnumber   rms   

使用CIFilter可以不引入任何第三方庫,就可以產生想要的二維碼和條碼,今天簡單的介紹一下使用CIFilter產生二維碼和條碼。系統CIFilter產生的二維碼和條碼的大小有時並不能滿足需求,直接使用起來,二維碼圖片看起來有些模糊,這就需要我們手動的根據目標大小重建清晰的二維碼和條碼。

1.產生二維碼(iOS7.0以上支援)

/** inputCorrectionLevel 等級  容錯率 L     7% M     15%  預設值 Q     25% H     30% */+ (UIImage *)generateQRCodeWithInputMessage:(NSString *)inputMessage                                      Width:(CGFloat)width                                     Height:(CGFloat)height{    NSData *inputData = [inputMessage dataUsingEncoding:NSUTF8StringEncoding];    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];    [filter setValue:inputData forKey:@"inputMessage"];    //    [filter setValue:@"H" forKey:@"inputCorrectionLevel"]; // 設定二維碼不同層級的容錯率    CIImage *ciImage = filter.outputImage;    // 消除模糊    CGFloat scaleX = MIN(width, height)/ciImage.extent.size.width;    CGFloat scaleY = MIN(width, height)/ciImage.extent.size.height;    ciImage = [ciImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)];    UIImage *returnImage = [UIImage imageWithCIImage:ciImage];    return returnImage;}

 

二維碼中心添加圖片

 + (UIImage *)generateQRCodeWithInputMessage:(NSString *)inputMessage                                      Width:(CGFloat)width                                     Height:(CGFloat)height                             AndCenterImage:(UIImage *)centerImage{    UIImage *backImage = [self generateQRCodeWithInputMessage:inputMessage Width:width Height:height];    UIGraphicsBeginImageContext(backImage.size);    [backImage drawInRect:CGRectMake(0, 0, backImage.size.width, backImage.size.height)];    CGFloat centerImageWH = MIN(backImage.size.width, backImage.size.height) * 0.15;    [centerImage drawInRect:CGRectMake((backImage.size.width - centerImageWH)*0.5, (backImage.size.height - centerImageWH)*0.5, centerImageWH, centerImageWH)];    UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return returnImage;}

 

**2. 產生條碼 (iOS8.0以上 支援)**

#pragma mark - 擷取條碼-(UIImage*)createBarImageWithOrderStr:(NSString*)str{    // 建立條碼    CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];    // 恢複濾鏡的預設屬性    [filter setDefaults];    // 將字串轉換成NSData    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];    // 通過KVO設定濾鏡inputMessage資料    [filter setValue:data forKey:@"inputMessage"];    // 獲得濾鏡輸出的映像    CIImage *outputImage = [filter outputImage];    // 將CIImage轉換成UIImage,並放大顯示    UIImage* image =  [UIImage imageWithCIImage:outputImage scale:0 orientation:UIImageOrientationUp];    return image;}

 



+ (UIImage *)generateBarcodeWithInputMessage:(NSString *)inputMessage                                       Width:(CGFloat)width                                      Height:(CGFloat)height{    NSData *inputData = [inputMessage dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:false];    CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];    [filter setValue:inputData forKey:@"inputMessage"]; // 設定條碼內容    //    [filter setValue:@(50) forKey:@"inputQuietSpace"]; // 設定條碼上下左右margin值    //    [filter setValue:@(height) forKey:@"inputBarcodeHeight"]; // 設定條碼高度    CIImage *ciImage = filter.outputImage;    CGFloat scaleX = width/ciImage.extent.size.width;    CGFloat scaleY = height/ciImage.extent.size.height;    ciImage = [ciImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)];    UIImage *returnImage = [UIImage imageWithCIImage:ciImage];    return returnImage;}

 

/**產生條碼*/(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對象*/(CIImage *) generateBarCodeImage:(NSString *)source{  // iOS 8.0以上的系統才支援條碼的產生,iOS8.0以下使用第三方控制項產生  if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {    // 注意產生條碼的編碼方式    NSData *data = [source dataUsingEncoding: NSASCIIStringEncoding];    CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];    [filter setValue:data forKey:@"inputMessage"];    // 設定產生的條碼的上,下,左,右的margins的值    [filter setValue:[NSNumber numberWithInteger:0] forKey:@"inputQuietSpace"];    return filter.outputImage;  }else{    return nil;  }}

 

**3. 產生自訂的二維碼和條碼的大小**
/**調整產生的圖片的大小@param image CIImage對象@param size 需要的UIImage的大小@return size大小的UIImage對象*/(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;  }}

 

以上就是使用iOS系統原生的CIFilter產生二維碼和條碼,對於產生二維碼和條碼時,CIFilter的參數的定義可以參考官方文檔。

官網:CIFilter

iOS - 原生的CIFilter產生二維碼和條碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.