今天做项目基本是完成了,测试也进入尾声,同事给我说要我把二维码变成彩色的,我对着原来前辈写的工程研究来研究去,找了很多资料还是没弄好,还是一直失败,于是找了一下我同学,问了一下他,结果他上班没时间帮我看,但是却帮我开了脑洞,我突然发现自己太死板了,死磕在原来代码上,其实到github上搜一搜有很多写好的代码供我使用,但是我没有想到,工作是讲究效率的,学习可以死磕,但是工作上一定要头脑灵活,学会使用八方资源,把自己的工作效率大大提高,受教。

把今天使用的二维码生成与大家分享。Demo地址:点击打开链接

QRCodeImage.h

#import <UIKit/UIKit.h>@interface QRCodeImage : UIImage/***  1.生成一个二维码**  @param string 字符串*  @param width  二维码宽度**  @return <#return value description#>*/
+ (QRCodeImage *_Nonnull)codeImageWithString:(NSString *_Nullable)stringsize:(CGFloat)width;/***  2.生成一个二维码**  @param string 字符串*  @param width  二维码宽度*  @param color  二维码颜色**  @return <#return value description#>*/
+ (QRCodeImage *_Nonnull)codeImageWithString:(NSString *_Nullable)stringsize:(CGFloat)widthcolor:(UIColor *_Nullable)color;
/***  3.生成一个二维码**  @param string    字符串*  @param width     二维码宽度*  @param color     二维码颜色*  @param icon      头像*  @param iconWidth 头像宽度,建议宽度小于二维码宽度的1/4**  @return <#return value description#>*/
+ (QRCodeImage *_Nonnull)codeImageWithString:(NSString *_Nullable)stringsize:(CGFloat)widthcolor:(UIColor *_Nullable)coloricon:(UIImage *_Nullable)iconiconWidth:(CGFloat)iconWidth;@end

QRCodeImage.m

#import "QRCodeImage.h"@implementation QRCodeImage+ (QRCodeImage *)codeImageWithString:(NSString *)stringsize:(CGFloat)width
{CIImage *ciImage = [QRCodeImage createQRForString:string];if (ciImage) {return [QRCodeImage createNonInterpolatedUIImageFormCIImage:ciImagesize:width];} else {return nil;}
}+ (QRCodeImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)imagesize:(CGFloat)size {CGRect extent = CGRectIntegral(image.extent);CGFloat scale = MIN(size/CGRectGetWidth(extent),size/CGRectGetHeight(extent));// 1.创建一个位图图像,绘制到其大小的位图上下文size_t width        = CGRectGetWidth(extent) * scale;size_t height       = CGRectGetHeight(extent) * scale;CGColorSpaceRef cs  = CGColorSpaceCreateDeviceGray();CGContextRef bitmapRef = CGBitmapContextCreate(nil,width,height,8,0,cs,(CGBitmapInfo)kCGImageAlphaNone);CIContext *context     = [CIContext contextWithOptions:nil];CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);CGContextScaleCTM(bitmapRef, scale, scale);CGContextDrawImage(bitmapRef, extent, bitmapImage);// 2.创建具有内容的位图图像CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);// 3.清理CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return (QRCodeImage*)[UIImage imageWithCGImage:scaledImage];
}+ (CIImage *)createQRForString:(NSString *)qrString {// 1.将字符串转换为UTF8编码的NSData对象NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];// 2.创建filterCIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];// 3.设置内容和纠错级别[qrFilter setValue:stringData forKey:@"inputMessage"];[qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];// 4.返回CIImagereturn qrFilter.outputImage;
}void ProviderReleaseData (void *info, const void *data, size_t size){free((void*)data);
}+ (QRCodeImage *_Nonnull)codeImageWithString:(NSString *_Nullable)stringsize:(CGFloat)widthcolor:(UIColor *_Nullable)color;
{QRCodeImage *image = [QRCodeImage codeImageWithString:string size:width];const CGFloat *components = CGColorGetComponents(color.CGColor);CGFloat red     = components[0]*255;CGFloat green   = components[1]*255;CGFloat blue    = components[2]*255;const int imageWidth    = image.size.width;const int imageHeight   = image.size.height;size_t      bytesPerRow = imageWidth * 4;uint32_t* rgbImageBuf   = (uint32_t*)malloc(bytesPerRow * imageHeight);// 1.创建上下文CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(rgbImageBuf,imageWidth,imageHeight,8,bytesPerRow,colorSpace,kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);// 2.像素转换int pixelNum = imageWidth * imageHeight;uint32_t* pCurPtr = rgbImageBuf;for (int i = 0; i < pixelNum; i++, pCurPtr++){if ((*pCurPtr & 0xFFFFFF00) < 0x99999900){uint8_t* ptr = (uint8_t*)pCurPtr;ptr[3] = red; //0~255ptr[2] = green;ptr[1] = blue;}else{uint8_t* ptr = (uint8_t*)pCurPtr;ptr[0] = 0;}}// 3.生成UIImageCGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL,rgbImageBuf,bytesPerRow * imageHeight,ProviderReleaseData);CGImageRef imageRef = CGImageCreate(imageWidth,imageHeight,8,32,bytesPerRow,colorSpace,kCGImageAlphaLast | kCGBitmapByteOrder32Little,dataProvider,NULL,true,kCGRenderingIntentDefault);CGDataProviderRelease(dataProvider);QRCodeImage* resultUIImage = (QRCodeImage*)[UIImage imageWithCGImage:imageRef];// 4.释放CGImageRelease(imageRef);CGContextRelease(context);CGColorSpaceRelease(colorSpace);return resultUIImage;
}+ (QRCodeImage *_Nonnull)codeImageWithString:(NSString *_Nullable)stringsize:(CGFloat)widthcolor:(UIColor *_Nullable)coloricon:(UIImage *_Nullable)iconiconWidth:(CGFloat)iconWidth
{QRCodeImage *bgImage = [QRCodeImage codeImageWithString:stringsize:widthcolor:color];UIGraphicsBeginImageContext(bgImage.size);[bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];CGFloat x = (bgImage.size.width - iconWidth) * 0.5;CGFloat y = (bgImage.size.height - iconWidth) * 0.5;[icon drawInRect:CGRectMake( x,  y, iconWidth,  iconWidth)];UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return (QRCodeImage *)newImage;
}@end

使用方法

QRCodeImage *qrCodeImage = [QRCodeImage codeImageWithString:@"https://github.com/EmyWong/PersonalUITech"size:200color:[UIColor orangeColor]];UIImageView *qrImageView = [[UIImageView alloc]initWithImage:qrCodeImage];qrImageView.center = self.view.center;[self.view addSubview:qrImageView];self.qrImageView = qrImageView;

快来把你的二维码变成彩色的吧~

iOS 实现二维码的彩色效果相关推荐

  1. iOS 生成二维码/条形码

    级别:★★☆☆☆ 标签:「iOS CIFilter」「CIQRCodeGenerator」「CICode128BarcodeGenerator」「二维码加logo」 作者: Xs·H 审校: QiSh ...

  2. iOS 花式二维码生成和二维码识别

    iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个 ...

  3. iOS上二维码和一维码识别系列一

    这段时间在做iOS上二维码和一维码的识别 其间遇到问题无数, 特此总结下来, 希望能给后来的同学供参考 在iOS上, 做二维码识别, 首先在网上查找资料, 查找到ZBar和ZXing这两个开源的识别程 ...

  4. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  5. iOS 原生二维码扫描和生成

    代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...

  6. iOS原生二维码扫描(一)

    首先搭建一个最初步的能识别出二维码信息的最基本框架: @interface ScanCodeViewController ()<AVCaptureMetadataOutputObjectsDel ...

  7. ios微信二维码无法长按识别的若干解决方案

    ios微信二维码无法长按识别的若干解决方案 参考文章: (1)ios微信二维码无法长按识别的若干解决方案 (2)https://www.cnblogs.com/is17/p/5777373.html ...

  8. 渠道二维码怎么做效果溯源

    二维码简介 二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的.黑白相间的.记录数据符号信息的图形:在代码编制上巧妙地利用构成计算机内部逻 ...

  9. iOS开发—二维码扫描-郭宏志-专题视频课程

    iOS开发-二维码扫描-3869人已学习 课程介绍         本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...

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

    前言 扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架 开始之前,让我们谈谈Core Image框架中最重要的几个类: CIContext ...

最新文章

  1. [SOA征文]SOA如何起步?
  2. Prim算法生成迷宫
  3. MacOS系统下简单安装以及配置MongoDB数据库(一)
  4. python使用函数的目的_python之函数基本使用
  5. SAP CDS view权限控制实现原理介绍
  6. php网站加广告位,HotNews Pro主题文章内容上面添加广告位
  7. kafkatemplate无法注入_Spring-Kafka(三)-KafkaTemplate发送消息及结果回调
  8. 大数高精加减乘除(洛谷P1601、P2142、P1303、P1480题题解,Java语言描述)
  9. 轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发
  10. 博客园 文章和随笔区别 (转
  11. 【最新】Oracle官网Java SE各个版本JDK下载位置
  12. java无经验_应届生没有项目经验怎么面试?(java篇)
  13. ❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️
  14. 路由器显示未连接网络连接到服务器ip,无线网络连接没有有效的ip配置怎么办?...
  15. 键盘轴体怎么选,HHKB键盘来告诉你
  16. arcengine shp数据导入gdb中
  17. 解决 Performing stop of activity that is not resumed 报错!!
  18. uniapp 图片涂鸦、画笔 Ba-ImagePaint
  19. Pandas之DataFrame详解
  20. git detached

热门文章

  1. 优酷搞笑--万万没想到--台词
  2. OnlyOffice快速入门
  3. 基于JAVA毕业生交流学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
  4. [CVPR2021]pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis
  5. 八、Sentinel.conf 配置文件详细介绍
  6. 三层交换机转发原理与实验(三层交换技术原理,MLS条目,虚接口详解与配置)
  7. 山东理工acm 3926 bLue的二叉树
  8. 台湾大学开放式课程C语言,国立台湾大学-台大开放式课程.doc
  9. Python(高级FTP作业)
  10. Java 第一阶段建立编程思想 【面向对象编程(中级部分)】