今天做项目基本是完成了,测试也进入尾声,同事给我说要我把二维码变成彩色的,我对着原来前辈写的工程研究来研究去,找了很多资料还是没弄好,还是一直失败,于是找了一下我同学,问了一下他,结果他上班没时间帮我看,但是却帮我开了脑洞,我突然发现自己太死板了,死磕在原来代码上,其实到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. 显著提升图像识别网络效率,Facebook提出IdleBlock混合组成方法
  2. 用身体给可穿戴设备充电,网友:离人类被当作电池更近一步!
  3. pytorch Flatten展平
  4. 大话设计模式读书笔记11----建造者模式(Builder)
  5. Android利用AccessibilityService自动获取微信号
  6. Coolite TextField添加回车事件
  7. 《剑指offer》旋转数组的最小数字
  8. hdu 6406(思路+数据结构)
  9. Quartz.Net定时任务EF+MVC版的web服务
  10. 二进制样式的字符串与byte数组互转函数示例
  11. B/S----验证方式及练习
  12. 谷歌浏览器(1) : 主题
  13. 语音降噪/语音增强的几种算法
  14. r语言股票接口如何获取数据?
  15. 什么是区块链?CNS积分怎么赚钱
  16. CSDN上海英雄会嘉宾及议程曝光 不能错过的期待
  17. 教你删除鼠标右键菜单,清理“新建”菜单的方法!
  18. html静态页面作业 出行网站设计——洛阳城旅游(34页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板 出游
  19. Java 实例 - 在指定目录中查找文件
  20. 坝体监控系统技术说明书

热门文章

  1. [转]caffe源码解析 — caffe.proto
  2. android qq分享图文中的图标不显示问题的解决
  3. 报错the confidence keyword argument is only available if OpenCV is installed的解决方法
  4. 卸载正在使用中的tcp_congestion_control模块
  5. 陆奇:创业必知的10大驱动力,让你成为水塘中最大的鱼
  6. 虚幻引擎4初探(UE4)
  7. scratch编程小游戏黑白棋
  8. 苹果发布会总结:Mac 三产品线更新自研 M1 芯片,尝鲜只要 5299 元
  9. Spring4 Spring MVC实战(一)——读《Spring in action》搭建最简单的MVC
  10. 《Spring实战3》第七章 使用Spring MVC构建Web应用程序