生成二维码 - (Obj-C)

这里将通过系统提供的CoreImage滤镜来实现二维码生成
在CoreImage中提供了很多分类,不同的分类提供了不同的滤镜,生成二维码将要使用的分类是: kCICategoryBuiltIn

系统分类:

    /*      Categories:
    CORE_IMAGE_EXPORT NSString * const kCICategoryDistortionEffect;
    CORE_IMAGE_EXPORT NSString * const kCICategoryGeometryAdjustment;
    CORE_IMAGE_EXPORT NSString * const kCICategoryCompositeOperation;
    CORE_IMAGE_EXPORT NSString * const kCICategoryHalftoneEffect;
    CORE_IMAGE_EXPORT NSString * const kCICategoryColorAdjustment;--->颜色
    CORE_IMAGE_EXPORT NSString * const kCICategoryColorEffect;
    CORE_IMAGE_EXPORT NSString * const kCICategoryTransition;
    CORE_IMAGE_EXPORT NSString * const kCICategoryTileEffect;
    CORE_IMAGE_EXPORT NSString * const kCICategoryGenerator;
    CORE_IMAGE_EXPORT NSString * const kCICategoryReduction NS_AVAILABLE(10_5, 5_0);
    CORE_IMAGE_EXPORT NSString * const kCICategoryGradient;   --->渐变
    CORE_IMAGE_EXPORT NSString * const kCICategoryStylize;    --->风格化
    CORE_IMAGE_EXPORT NSString * const kCICategorySharpen;    --->锐化
    CORE_IMAGE_EXPORT NSString * const kCICategoryBlur;       --->高斯模糊
    CORE_IMAGE_EXPORT NSString * const kCICategoryVideo;
    CORE_IMAGE_EXPORT NSString * const kCICategoryStillImage;
    CORE_IMAGE_EXPORT NSString * const kCICategoryInterlaced;
    CORE_IMAGE_EXPORT NSString * const kCICategoryNonSquarePixels;
    CORE_IMAGE_EXPORT NSString * const kCICategoryHighDynamicRange;
    CORE_IMAGE_EXPORT NSString * const kCICategoryBuiltIn;     ---> 内嵌
    CORE_IMAGE_EXPORT NSString * const kCICategoryFilterGenerator NS_AVAILABLE(10_5, 9_0);
     */

通过filterNamesInCategory方法可以打印出该分类中包含的滤镜:

    NSArray *filterArr = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
    // 打印kCICategoryBuiltIn中包含的滤镜
    NSLog(@"%@",filterArr);
    /*
     CIAccordionFoldTransition,
     CIAdditionCompositing,
     CIAffineClamp,
     CIAffineTile,
     CIAffineTransform,
     CIAreaAverage,
     CIAreaHistogram,
     CIAreaMaximum,
     CIAreaMaximumAlpha,
     CIAreaMinimum,
     CIAreaMinimumAlpha,
     CIAztecCodeGenerator,
     CIBarsSwipeTransition,
     CIBlendWithAlphaMask,
     CIBlendWithMask,
     CIBloom,
     CIBoxBlur,
     CIBumpDistortion,
     CIBumpDistortionLinear,
     CICheckerboardGenerator,
     CICircleSplashDistortion,
     CICircularScreen,
     CICircularWrap,
     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,
     CIKaleidoscope,
     CILanczosScaleTransform,
     CILenticularHaloGenerator,
     CILightenBlendMode,
     CILightTunnel,
     CILinearBurnBlendMode,
     CILinearDodgeBlendMode,
     CILinearGradient,
     CILinearToSRGBToneCurve,
     CILineOverlay,
     CILineScreen,
     CILuminosityBlendMode,
     CIMaskedVariableBlur,
     CIMaskToAlpha,
     CIMaximumComponent,
     CIMaximumCompositing,
     CIMedianFilter,
     CIMinimumComponent,
     CIMinimumCompositing,
     CIModTransition,
     CIMotionBlur,
     CIMultiplyBlendMode,
     CIMultiplyCompositing,
     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,
     CIToneCurve,
     CITorusLensDistortion,
     CITriangleKaleidoscope,
     CITriangleTile,
     CITwelvefoldReflectedTile,
     CITwirlDistortion,
     CIUnsharpMask,
     CIVibrance,
     CIVignette,
     CIVignetteEffect,
     CIVortexDistortion,
     CIWhitePointAdjust,
     CIZoomBlur

生成二维码需要使用的滤镜是: CIQRCodeGenerator

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; // 设置默认的

示例代码:

#import "ViewController.h"
// #import <CoreImage/CoreImage.h> 可以不用导入直接使用

@interface ViewController ()

@end

@implementation ViewController{
    
    UIImageView *_imageView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 200, 200)];
    _imageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.view addSubview:_imageView];
    
    // 1.创建滤镜
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    
    // 2.设置属性  首先要设置默认选项
    [filter setDefaults];
    // NSLog(@"%@",filter.inputKeys);
    
    NSString *inputContent = @"生成二维码";
    [filter setValue:[inputContent dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
    
    /* 细节1:
     [filter setValue:@"生成二维码" forKey:@"inputMessage"];这种方式设置会报错:
      - Terminating app due to uncaught exception 'CIQRCodeGenerator', reason: 'CIQRCodeGenerator filter requires NSData for inputMessage'
     */
    
    // 3.根据滤镜生成图片
    CIImage *image = filter.outputImage;
    
    /* 细节2:
       设置尺寸,防止图片尺寸小于图片框导致放大模糊
     */
    image = [image imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)];
    
    // 展示生成的二维码
    _imageView.image = [UIImage imageWithCIImage:image];
    
}

@end

注意点:
1.设置inputMessage时,参数需要使用NSData类型
2.生成图片尺寸很有可能会小于视图控件的尺寸,所以会出现模糊的现象,可以适当对图片进行放大

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容