扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架
开始之前,让我们谈谈Core Image框架中最重要的几个类:
CIContext. 所有图像处理都是在一个CIContext 中完成的,这很像是一个Core Image处理器或是OpenGL的上下文。
CIImage. 这个类保存图像数据。它可以从UIImage、图像文件、或者是像素数据中构造出来。
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; // 设置默认的
// 获取分类里对应的二维码的过滤器
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
..
步骤:
@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将图片绘制上去,不是特别常用