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

本文介绍了如何在iOS应用中使用Core Image框架生成黑白和彩色二维码,以及如何在黑白二维码上添加图片。核心类包括CIContext、CIImage和CIFilter,特别是使用CIQRCodeGenerator滤镜进行二维码生成。步骤包括设置滤镜、输入信息、调整大小,并通过CIFalseColor滤镜实现彩色二维码。同时,文章还探讨了在二维码上添加图片的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

扫描二维码使用的是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];

这里写图片描述

黑白带图片的二维码

就是在生成黑马二维码的基础上获取图形上下文的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;

这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值