iOS 实现二维码的彩色效果
今天做项目基本是完成了,测试也进入尾声,同事给我说要我把二维码变成彩色的,我对着原来前辈写的工程研究来研究去,找了很多资料还是没弄好,还是一直失败,于是找了一下我同学,问了一下他,结果他上班没时间帮我看,但是却帮我开了脑洞,我突然发现自己太死板了,死磕在原来代码上,其实到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 实现二维码的彩色效果相关推荐
- iOS 生成二维码/条形码
级别:★★☆☆☆ 标签:「iOS CIFilter」「CIQRCodeGenerator」「CICode128BarcodeGenerator」「二维码加logo」 作者: Xs·H 审校: QiSh ...
- iOS 花式二维码生成和二维码识别
iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个 ...
- iOS上二维码和一维码识别系列一
这段时间在做iOS上二维码和一维码的识别 其间遇到问题无数, 特此总结下来, 希望能给后来的同学供参考 在iOS上, 做二维码识别, 首先在网上查找资料, 查找到ZBar和ZXing这两个开源的识别程 ...
- iOS开发-二维码扫描和应用跳转
iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...
- iOS 原生二维码扫描和生成
代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...
- iOS原生二维码扫描(一)
首先搭建一个最初步的能识别出二维码信息的最基本框架: @interface ScanCodeViewController ()<AVCaptureMetadataOutputObjectsDel ...
- ios微信二维码无法长按识别的若干解决方案
ios微信二维码无法长按识别的若干解决方案 参考文章: (1)ios微信二维码无法长按识别的若干解决方案 (2)https://www.cnblogs.com/is17/p/5777373.html ...
- 渠道二维码怎么做效果溯源
二维码简介 二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的.黑白相间的.记录数据符号信息的图形:在代码编制上巧妙地利用构成计算机内部逻 ...
- iOS开发—二维码扫描-郭宏志-专题视频课程
iOS开发-二维码扫描-3869人已学习 课程介绍 本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...
- iOS 开发 二维码生成大全(黑白/彩色二维码和带图片的二维码)详解
前言 扫描二维码使用的是coreImage框架,属于UIKit框架中的体系,多以使用时不用导入coreImage框架 开始之前,让我们谈谈Core Image框架中最重要的几个类: CIContext ...
最新文章
- [SOA征文]SOA如何起步?
- Prim算法生成迷宫
- MacOS系统下简单安装以及配置MongoDB数据库(一)
- python使用函数的目的_python之函数基本使用
- SAP CDS view权限控制实现原理介绍
- php网站加广告位,HotNews Pro主题文章内容上面添加广告位
- kafkatemplate无法注入_Spring-Kafka(三)-KafkaTemplate发送消息及结果回调
- 大数高精加减乘除(洛谷P1601、P2142、P1303、P1480题题解,Java语言描述)
- 轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发
- 博客园 文章和随笔区别 (转
- 【最新】Oracle官网Java SE各个版本JDK下载位置
- java无经验_应届生没有项目经验怎么面试?(java篇)
- ❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️
- 路由器显示未连接网络连接到服务器ip,无线网络连接没有有效的ip配置怎么办?...
- 键盘轴体怎么选,HHKB键盘来告诉你
- arcengine shp数据导入gdb中
- 解决 Performing stop of activity that is not resumed 报错!!
- uniapp 图片涂鸦、画笔 Ba-ImagePaint
- Pandas之DataFrame详解
- git detached
热门文章
- 优酷搞笑--万万没想到--台词
- OnlyOffice快速入门
- 基于JAVA毕业生交流学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
- [CVPR2021]pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis
- 八、Sentinel.conf 配置文件详细介绍
- 三层交换机转发原理与实验(三层交换技术原理,MLS条目,虚接口详解与配置)
- 山东理工acm 3926 bLue的二叉树
- 台湾大学开放式课程C语言,国立台湾大学-台大开放式课程.doc
- Python(高级FTP作业)
- Java 第一阶段建立编程思想 【面向对象编程(中级部分)】