iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解

前言

扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架

开始之前,让我们谈谈Core Image框架中最重要的几个类:

  • CIContext. 所有图像处理都是在一个CIContext 中完成的,这很像是一个Core Image处理器或是OpenGL的上下文。

  • CIImage. 这个类保存图像数据。它可以从UIImage、图像文件、或者是像素数据中构造出来。

  • CIFilter. 滤镜类包含一个字典结构,对各种滤镜定义了属于他们各自的属性。滤镜有很多种,比如鲜艳程度滤镜,色彩反转滤镜,剪裁滤镜等等。

CIFilter的主要属性:

@property (readonly, nonatomic, nullable) CIImage *outputImage; // 生成的图片
    @property (nonatomic, readonly) NSString *name
    @property (nonatomic, copy) NSString *name
    @property (getter=isEnabled) BOOL enabled
    @property (nonatomic, readonly) CI_ARRAY(NSString*) *inputKeys; // 输入内容的设置
             inputMessage          -    输入信息
             inputCorrectionLevel  -    容错等级
    @property (nonatomic, readonly) CI_ARRAY(NSString*) *outputKeys;// 输出内容的设置
    @property (nonatomic, readonly) CI_DICTIONARY(NSString*,id) *attributes;
     - (void)setDefaults; // 设置默认的

kCICategoryBuiltIn分类包含的滤镜

  // 获取分类里对应的二维码的过滤器
    NSArray *tempArray = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
    NSLog(@"%@",tempArray);
    CIAccordionFoldTransition,
    CIAdditionCompositing,
    CIAffineClamp,
    CIAffineTile,
    CIAffineTransform,
    CIAreaAverage,
    CIAreaHistogram,
    CIAreaMaximum,
    CIAreaMaximumAlpha,
    CIAreaMinimum,
    CIAreaMinimumAlpha,
    CIAztecCodeGenerator,
    CIBarsSwipeTransition,
    CIBlendWithAlphaMask,
    CIBlendWithMask,
    CIBloom,
    CIBoxBlur,
    CIBumpDistortion,
    CIBumpDistortionLinear,
    CICheckerboardGenerator,
    CICircleSplashDistortion,
    CICircularScreen,
    CICircularWrap,
    CIClamp,
    CICMYKHalftone,
    CICode128BarcodeGenerator,
    CIColorBlendMode,
    CIColorBurnBlendMode,
    CIColorClamp,
    CIColorControls,
    CIColorCrossPolynomial,
    CIColorCube,
    CIColorCubeWithColorSpace,
    CIColorDodgeBlendMode,
    CIColorInvert,
    CIColorMap,
    CIColorMatrix,
    CIColorMonochrome,
    CIColorPolynomial,
    CIColorPosterize,
    CIColumnAverage,
    CIComicEffect,
    CIConstantColorGenerator,
    CIConvolution3X3,
    CIConvolution5X5,
    CIConvolution7X7,
    CIConvolution9Horizontal,
    CIConvolution9Vertical,
    CICopyMachineTransition,
    CICrop,
    CICrystallize,
    CIDarkenBlendMode,
    CIDepthOfField,
    CIDifferenceBlendMode,
    CIDiscBlur,
    CIDisintegrateWithMaskTransition,
    CIDisplacementDistortion,
    CIDissolveTransition,
    CIDivideBlendMode,
    CIDotScreen,
    CIDroste,
    CIEdges,
    CIEdgeWork,
    CIEightfoldReflectedTile,
    CIExclusionBlendMode,
    CIExposureAdjust,
    CIFalseColor,
    CIFlashTransition,
    CIFourfoldReflectedTile,
    CIFourfoldRotatedTile,
    CIFourfoldTranslatedTile,
    CIGammaAdjust,
    CIGaussianBlur,
    CIGaussianGradient,
    CIGlassDistortion,
    CIGlassLozenge,
    CIGlideReflectedTile,
    CIGloom,
    CIHardLightBlendMode,
    CIHatchedScreen,
    CIHeightFieldFromMask,
    CIHexagonalPixellate,
    CIHighlightShadowAdjust,
    CIHistogramDisplayFilter,
    CIHoleDistortion,
    CIHueAdjust,
    CIHueBlendMode,
    CIHueSaturationValueGradient,
    CIKaleidoscope,
    CILanczosScaleTransform,
    CILenticularHaloGenerator,
    CILightenBlendMode,
    CILightTunnel,
    CILinearBurnBlendMode,
    CILinearDodgeBlendMode,
    CILinearGradient,
    CILinearToSRGBToneCurve,
    CILineOverlay,
    CILineScreen,
    CILuminosityBlendMode,
    CIMaskedVariableBlur,
    CIMaskToAlpha,
    CIMaximumComponent,
    CIMaximumCompositing,
    CIMedianFilter,
    CIMinimumComponent,
    CIMinimumCompositing,
    CIModTransition,
    CIMotionBlur,
    CIMultiplyBlendMode,
    CIMultiplyCompositing,
    CINinePartStretched,
    CINinePartTiled,
    CINoiseReduction,
    CIOpTile,
    CIOverlayBlendMode,
    CIPageCurlTransition,
    CIPageCurlWithShadowTransition,
    CIParallelogramTile,
    CIPDF417BarcodeGenerator,
    CIPerspectiveCorrection,
    CIPerspectiveTile,
    CIPerspectiveTransform,
    CIPerspectiveTransformWithExtent,
    CIPhotoEffectChrome,
    CIPhotoEffectFade,
    CIPhotoEffectInstant,
    CIPhotoEffectMono,
    CIPhotoEffectNoir,
    CIPhotoEffectProcess,
    CIPhotoEffectTonal,
    CIPhotoEffectTransfer,
    CIPinchDistortion,
    CIPinLightBlendMode,
    CIPixellate,
    CIPointillize,
    CIQRCodeGenerator,  // 二维码的滤镜
    CIRadialGradient,
    CIRandomGenerator,
    CIRippleTransition,
    CIRowAverage,
    CISaturationBlendMode,
    CIScreenBlendMode,
    CISepiaTone,
    CIShadedMaterial,
    CISharpenLuminance,
    CISixfoldReflectedTile,
    CISixfoldRotatedTile,
    CISmoothLinearGradient,
    CISoftLightBlendMode,
    CISourceAtopCompositing,
    CISourceInCompositing,
    CISourceOutCompositing,
    CISourceOverCompositing,
    CISpotColor,
    CISpotLight,
    CISRGBToneCurveToLinear,
    CIStarShineGenerator,
    CIStraightenFilter,
    CIStretchCrop,
    CIStripesGenerator,
    CISubtractBlendMode,
    CISunbeamsGenerator,
    CISwipeTransition,
    CITemperatureAndTint,
    CIThermal,
    CIToneCurve,
    CITorusLensDistortion,
    CITriangleKaleidoscope,
    CITriangleTile,
    CITwelvefoldReflectedTile,
    CITwirlDistortion,
    CIUnsharpMask,
    CIVibrance,
    CIVignette,
    CIVignetteEffect,
    CIVortexDistortion,
    CIWhitePointAdjust,
    CIXRay,
    CIZoomBlur

黑白二维码的生成

  • 二维码其实就是包含一些信息的图片
  • 大部分二维码是黑白二维码
  • CIFilter过滤器有很多分类,这里生成二维码使用的是kCICategoryBuiltIn分类,返回的是一个包含很多滤镜数组,找到CIQRCodeGenerator二维码生成滤镜

..

步骤:

  1. 创建二维码过滤器
  2. 设置二维码内容/容错率(KVC实现),inputMessage必须要传入二进制.
  3. 输出二维码图片(默认是27 * 27大小)
  4. 放大图片比例(生成的原始图比较小)
  5. 给imageView赋值
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
    // 1.创建二维码过滤器
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 2.设置默认值
    [qrFilter setDefaults];
    /*
     inputMessage,         二维码的内容
     inputCorrectionLevel  二维码的容错率
     */
    NSLog(@"%@",qrFilter.inputKeys);
    // 3.给二维码过滤器添加信息  KVC
    // inputMessage必须要传入二进制   否则会崩溃
    [qrFilter setValue:[@"https://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
    // 4.获取二维码的图片
    CIImage *ciimage = qrFilter.outputImage;
    // 放大图片的比例
    ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
    NSLog(@"%@",ciimage);
    // 5.给imageView赋值
    self.imageView.image = [UIImage imageWithCIImage:ciimage];

这里写图片描述

彩色二维码生成

就是在黑白二维码的基础上设置颜色过滤器
CIFalseColor

 // 1.创建二维码过滤器
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 2.设置默认值
    [qrFilter setDefaults];
    /*
     inputMessage,         二维码的内容
     inputCorrectionLevel  二维码的容错率
     */
    NSLog(@"%@",qrFilter.inputKeys);
    // 3.给二维码过滤器添加信息  KVC
    // inputMessage必须要传入二进制   否则会崩溃
    [qrFilter setValue:[@"二维码内容!!" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
    // 4.获取二维码的图片
    CIImage *ciimage = qrFilter.outputImage;
    // 放大图片的比例
    ciimage = [ciimage    imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
//    NSLog(@"%@",ciimage);

    // 5.创建颜色过滤器
    CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
    // 6.设置默认值
    [colorFilter setDefaults];
    /*
     inputImage,     需要设定颜色的图片
     inputColor0,    前景色 - 二维码的颜色
     inputColor1     背景色 - 二维码背景的颜色
     */
    NSLog(@"%@",colorFilter.inputKeys);
    // 7.给颜色过滤器添加信息
    // 设定图片
    [colorFilter setValue:ciimage forKey:@"inputImage"];
    // 设定前景色
    [colorFilter setValue:[CIColor colorWithRed:0 green:0 blue:1 ] forKey:@"inputColor0"];
    // 设定背景色
    [colorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0] forKey:@"inputColor1"];
    // 获取图片
    ciimage = colorFilter.outputImage;
    // 5.给imageView赋值
    self.imageView.image = [UIImage imageWithCIImage:ciimage];

iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解_第1张图片

黑白带图片的二维码

就是在生成黑马二维码的基础上获取图形上下文的drawInRect方法将需要的图片绘制上去

// 1.创建二维码过滤器
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 2.设置默认值
    [qrFilter setDefaults];
    /*
     inputMessage,         二维码的内容
     inputCorrectionLevel  二维码的容错率
     */
    NSLog(@"%@",qrFilter.inputKeys);
    // 3.给二维码过滤器添加信息  KVC
    // inputMessage必须要传入二进制   否则会崩溃
    [qrFilter setValue:[@"二维码内容!!" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
    // 4.获取二维码的图片
    CIImage *ciimage = qrFilter.outputImage;
    // 放大图片的比例
    ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
    NSLog(@"%@",ciimage);
    // 获取二维码图片
    UIImage *uiimage = [UIImage imageWithCIImage:ciimage];


    // 5.开启图形上下文
    UIGraphicsBeginImageContext(uiimage.size);
    // 6.画二维码的图片
    [uiimage drawInRect:CGRectMake(0, 0, uiimage.size.width, uiimage.size.height)];
    // 7.画程序员的图片
    UIImage *meImage = [UIImage imageNamed:@"程序员"];
    CGFloat meImageW = 50;
    CGFloat meImageH = 50;
    CGFloat meImageX = (uiimage.size.width - meImageW) * 0.5;
    CGFloat meImageY = (uiimage.size.height - meImageH) * 0.5;
    [meImage drawInRect:CGRectMake(meImageX, meImageY, meImageW, meImageH)];
    // 8.获取图片
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    // 9.关闭图形上下文
    UIGraphicsEndImageContext();
    // 10.给imageView赋值
    self.imageView.image = finalImage;

iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解_第2张图片

彩色的带图片的二维码就不用多说了,也就是再生成彩色二维码的基础上通过图形上下文的drawInRect将图片绘制上去,不是特别常用

你可能感兴趣的:(二维码,iOS开发)