iOS二维码、条形码生成(可指定大小、颜色)
一、前言:
iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小、指定颜色的二维码和条形码, 还可以添加背景颜色、阴影效果, 以下是具体方法.
二、二维码生成
因为返回的都是UIImage 所以我写了一个UIImage的分类
// UIimage(QRCode).h 文件
//Avilable in iOS 7.0 and later
+ (UIImage *)qrCodeImageWithContent:(NSString *)content
codeImageSize:(CGFloat)size
logo:(UIImage *)logo
logoFrame:(CGRect)logoFrame
red:(CGFloat)red
green:(CGFloat)green
blue:(NSInteger)blue; // UIimage(QRCode).m 实现文件
#pragma mark - 生成二维码
+ (UIImage *)qrCodeImageWithContent:(NSString *)content
codeImageSize:(CGFloat)size
logo:(UIImage *)logo
logoFrame:(CGRect)logoFrame
red:(CGFloat)red
green:(CGFloat)green
blue:(NSInteger)blue{ UIImage *image = [self qrCodeImageWithContent:content codeImageSize:size red:red green:green blue:blue];
//有 logo 则绘制 logo
if (logo != nil) {
UIGraphicsBeginImageContext(image.size);
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
[logo drawInRect:logoFrame];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
}else{
return image;
} } //改变二维码颜色
+ (UIImage *)qrCodeImageWithContent:(NSString *)content codeImageSize:(CGFloat)size red:(CGFloat)red green:(CGFloat)green blue:(NSInteger)blue{
UIImage *image = [self qrCodeImageWithContent:content codeImageSize:size];
int imageWidth = image.size.width;
int imageHeight = image.size.height;
size_t bytesPerRow = imageWidth * 4;
uint32_t *rgbImageBuf = (uint32_t *)malloc(bytesPerRow * imageHeight);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpaceRef, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
//遍历像素, 改变像素点颜色
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*255;
ptr[2] = green*255;
ptr[1] = blue*255;
}else{
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[0] = 0;
}
}
//取出图片
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpaceRef,
kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
UIImage *resultImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpaceRef); return resultImage;
} //改变二维码尺寸大小
+ (UIImage *)qrCodeImageWithContent:(NSString *)content codeImageSize:(CGFloat)size{
CIImage *image = [self qrCodeImageWithContent:content];
CGRect integralRect = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(integralRect), size/CGRectGetHeight(integralRect)); size_t width = CGRectGetWidth(integralRect)*scale;
size_t height = CGRectGetHeight(integralRect)*scale;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:integralRect];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, integralRect, bitmapImage); CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
} //生成最原始的二维码
+ (CIImage *)qrCodeImageWithContent:(NSString *)content{
CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
[qrFilter setValue:contentData forKey:@"inputMessage"];
[qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];
CIImage *image = qrFilter.outputImage;
return image;
} void ProviderReleaseData (void *info, const void *data, size_t size){
free((void*)data);
}
三、条形码生成
// .h文件
#pragma mark - 生成条形码
//Avilable in iOS 8.0 and later
+ (UIImage *)barcodeImageWithContent:(NSString *)content
codeImageSize:(CGSize)size
red:(CGFloat)red
green:(CGFloat)green
blue:(NSInteger)blue; #pragma mark - 生成条形码
+ (UIImage *)barcodeImageWithContent:(NSString *)content codeImageSize:(CGSize)size red:(CGFloat)red green:(CGFloat)green blue:(NSInteger)blue{
UIImage *image = [self barcodeImageWithContent:content codeImageSize:size];
int imageWidth = image.size.width;
int imageHeight = image.size.height;
size_t bytesPerRow = imageWidth * 4;
uint32_t *rgbImageBuf = (uint32_t *)malloc(bytesPerRow * imageHeight);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpaceRef, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
//遍历像素, 改变像素点颜色
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*255;
ptr[2] = green*255;
ptr[1] = blue*255;
}else{
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[0] = 0;
}
}
//取出图片
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpaceRef,
kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
UIImage *resultImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpaceRef); return resultImage;
} //改变条形码尺寸大小
+ (UIImage *)barcodeImageWithContent:(NSString *)content codeImageSize:(CGSize)size{
CIImage *image = [self barcodeImageWithContent:content];
CGRect integralRect = CGRectIntegral(image.extent);
CGFloat scale = MIN(size.width/CGRectGetWidth(integralRect), size.height/CGRectGetHeight(integralRect)); size_t width = CGRectGetWidth(integralRect)*scale;
size_t height = CGRectGetHeight(integralRect)*scale;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:integralRect];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, integralRect, bitmapImage); CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
} //生成最原始的条形码
+ (CIImage *)barcodeImageWithContent:(NSString *)content{
CIFilter *qrFilter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
[qrFilter setValue:contentData forKey:@"inputMessage"];
[qrFilter setValue:@(0.00) forKey:@"inputQuietSpace"];
CIImage *image = qrFilter.outputImage;
return image;
} void ProviderReleaseData (void *info, const void *data, size_t size){
free((void*)data);
}
四、测试
// 在控制器中实现
self.title = @"二维码和条形码"; //条形码
UIImage *barImage = [UIImage barcodeImageWithContent:@"123456"
codeImageSize:CGSizeMake(300, 90)
red:0
green:0.4
blue:0.6];
CGRect barImageView_Frame = CGRectMake(self.view.bounds.size.width/2-300/2, 100, 300, 90);
UIImageView *barImageView = [[UIImageView alloc] initWithFrame:barImageView_Frame];
barImageView.image = barImage;
barImageView.backgroundColor = [UIColor clearColor];
//阴影
barImageView.layer.shadowOffset = CGSizeMake(-0.5, 0.5);
barImageView.layer.shadowRadius = 0.5;
barImageView.layer.shadowColor = [UIColor blackColor].CGColor;
barImageView.layer.shadowOpacity = 0.2; [self.view addSubview:barImageView]; //二维码
UIImage *qrCodeImage = [UIImage qrCodeImageWithContent:@"15280107764"
codeImageSize:200
logo:[UIImage imageNamed:@"avatar"]
logoFrame:CGRectMake(75, 75, 50, 50)
red:0.0f
green:139/255.0f
blue:139/255.0f];
CGRect qrCodeImageView_Frame = CGRectMake(self.view.bounds.size.width/2-200/2, CGRectGetMaxY(barImageView.frame)+20, 200, 200);
UIImageView *qrCodeImageView = [[UIImageView alloc] initWithFrame:qrCodeImageView_Frame];
qrCodeImageView.image = qrCodeImage;
qrCodeImageView.backgroundColor = [UIColor whiteColor];// #006400
//阴影
qrCodeImageView.layer.shadowOffset = CGSizeMake(0, 0);
qrCodeImageView.layer.shadowRadius = 5;
qrCodeImageView.layer.shadowColor = [UIColor blackColor].CGColor;
qrCodeImageView.layer.shadowOpacity = 0.4; [self.view addSubview:qrCodeImageView];
// 参考来源 http://www.jianshu.com/p/b893690b472e
iOS二维码、条形码生成(可指定大小、颜色)的更多相关文章
- iOS 二维码的生成 QREncoder
生成二维码: 在生成二维码的库中QREncoder最为常见,但是由于中文字符的特殊性,生成中文的时候有时会出现一定的错误,所以建议使用libqrencode,是一个纯C编写的类库. 以libqrenc ...
- iOS:二维码的生成
所谓的二维码就是一个图片,只不过在iOS需要借用<CoreImage/CoreImage.h>来实现, 并且二维码图片是通过CIImage来转成UIImage的.具体步骤如下: // 1 ...
- 微信小程序-携带参数的二维码条形码生成
demo文件目录 index.js文件 //index.js var wxbarcode = require('../../utils/index.js'); Page({ data: { code: ...
- iOS二维码条形码的制作
- (IBAction)creatQRImage:(id)sender { [self.textField resignFirstResponder]; //这里是我放了个TextField的控件,但 ...
- iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码
iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...
- iOS系统原生 二维码的生成、扫描和读取(高清、彩色)
由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...
- Java 条形码 二维码 的生成与解析
Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...
- Java使用ZXing生成二维码条形码
一.下载Zxingjar包 本实例使用的是 zxing3.2.0的版本 下载地址 http://pan.baidu.com/s/1gdH7PzP 说明:本实例使用的3.2.0版本已经使用的java7 ...
- iOS开发 - 二维码的生成与读取
二维码的生成 从iOS7開始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk眼下不支持64位处理器 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 二维 ...
- C#MVC用ZXing.Net生成二维码/条形码
开篇:zxing.net是.net平台下编解条形码和二维码的工具. 首先创建新项目 选择MVC模板 添加一个控制器 在项目引用中的引用ZXing 进行联网下载 控制器需要引用 后台控制器 pu ...
随机推荐
- Linux查看端口占用情况,并强制释放占用的端口
1.查找被占用的端口 netstat -tln netstat -tln | grep 8080 netstat -tln 查看端口使用情况,而netstat -tln | grep 8080则是只查 ...
- Windows打开软件老是弹出无法验证发布者
使用组策略管理器 gpedit.msc 用户配置-管理模板-Windows组件-附件管理器-中等风险文件类型的包含列表 .exe;.cmd;.bat;.js即可
- raid 简单了解
独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks ...
- DDOS防护原理
1.常见DDoS攻击分类 DDoS粗略分类为流量型攻击和CC攻击.流量型攻击主要是通过发送报文侵占正常业务带宽,甚至堵塞整个数据中心的出口,导致正常用户访问无法达到业务服务器.CC攻击主要是针对某些业 ...
- 4.9版本的linux内核中eeprom存储芯片at24c512的驱动源码在哪里
答:drivers/misc/eeprom/at24.c,内核配置项为CONFIG_EEPROM_AT24 Location: -> Device Drivers -> Misc devi ...
- iOS开发值得学习的Demo
一.HXWeiboPhotoPicker - 仿微博照片选择器 GitHub地址:https://github.com/LoveZYForever/HXWeiboPhotoPicker 二.AFNet ...
- python一个元素全为数的列表做差分
woc = [7, 5, 7, 3, 5, 1, 2] diff = [ wo[i]-wo[i+1] for i in range(len(wo)-1) ]
- .Net Core 二级域名绑定到指定的控制器
在说二级域名绑定之前,先说一下.net core中的区域,关于区域这一块儿在很久之前的博客中,已经提过,详见<03-dotnet core创建区域[Areas]及后台搭建>,在这篇博客中, ...
- Mysql5.7基于事务转为基于日志
先决条件 master端执行 flush logs;show master status; 获取file和position slave端执行 stop slave; change master to ...
- Linux网络编程--进程间通信(一)
进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...