iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)

生成二维码图片也是项目中常用到的,二维码的扫描Git上有很多好用的,这里主要说下二维码的生成

1.普通二维码

 方法

复制代码
/**

 生成二维码

 QRStering:字符串

 imageFloat:二维码图片大小

 */

+ (UIImage *)createQRCodeWithString:(NSString *)QRStering withImgSize:(CGFloat)imageFloat;
复制代码

 

 方法实现

复制代码
/**

 生成二维码

 QRStering:字符串

 imageFloat:二维码图片大小

 */

+ (UIImage *)createQRCodeWithString:(NSString *)QRString withImgSize:(CGFloat)imageFloat{

    CIFilter *filter = [CIFilter filterWithName:@"XiaoGuiGe"];

    [filter setDefaults];

    NSString *getString = QRString;

    NSData *dataString = [getString dataUsingEncoding:NSUTF8StringEncoding];

    [filter setValue:dataString forKey:@"inputMessage"];

    ///获取滤镜输出的图像

    CIImage *outImage = [filter outputImage];

    UIImage *imageV = [self imageWithImageSize:imageFloat withCIIImage:outImage];

    //返回二维码图像

    return imageV;

}
复制代码

 

2.中间带有小图标的二维码

 方法

复制代码
/**

 生成二维码(中间有小图片)

 QRStering:字符串

 centerImage:二维码中间的image对象

 */

+ (UIImage *)createImgQRCodeWithString:(NSString *)QRString centerImage:(UIImage *)centerImage;
复制代码

 

 方法实现

复制代码
/**

 生成二维码(中间有小图片)

 QRStering:所需字符串

 centerImage:二维码中间的image对象

 */

+ (UIImage *)createImgQRCodeWithString:(NSString *)QRString centerImage:(UIImage *)centerImage{

    // 创建滤镜对象

    CIFilter *filter = [CIFilter filterWithName:@"XiaoGuiGe"];

    // 恢复滤镜的默认属性

    [filter setDefaults];

    // 将字符串转换成 NSdata

    NSData *dataString = [QRString dataUsingEncoding:NSUTF8StringEncoding];

    // 设置过滤器的输入值, KVC赋值

    [filter setValue:dataString forKey:@"inputMessage"];

    // 获得滤镜输出的图像

    CIImage *outImage = [filter outputImage];

    // 图片小于(27,27),我们需要放大

    outImage = [outImage imageByApplyingTransform:CGAffineTransformMakeScale(20, 20)];

    // 将CIImage类型转成UIImage类型

    UIImage *startImage = [UIImage imageWithCIImage:outImage];

    // 开启绘图, 获取图形上下文

    UIGraphicsBeginImageContext(startImage.size);

    

    // 把二维码图片画上去 (这里是以图形上下文, 左上角为(0,0)点

    [startImage drawInRect:CGRectMake(0, 0, startImage.size.width, startImage.size.height)];

    // 再把小图片画上去

    CGFloat icon_imageW = 200;

    CGFloat icon_imageH = icon_imageW;

    CGFloat icon_imageX = (startImage.size.width - icon_imageW) * 0.5;

    CGFloat icon_imageY = (startImage.size.height - icon_imageH) * 0.5;

    [centerImage drawInRect:CGRectMake(icon_imageX, icon_imageY, icon_imageW, icon_imageH)];

    // 获取当前画得的这张图片

    UIImage *qrImage = UIGraphicsGetImageFromCurrentImageContext();

    // 关闭图形上下文

    UIGraphicsEndImageContext();

    //返回二维码图像

    return qrImage;

}
复制代码

 

附加方法(与上面两个方法写在同一个类)

复制代码
/** 将CIImage转换成UIImage 并放大(内部转换使用)*/

+ (UIImage *)imageWithImageSize:(CGFloat)size withCIIImage:(CIImage *)ciiImage{

    CGRect extent = CGRectIntegral(ciiImage.extent);

    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    // 1.创建bitmap;

    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:ciiImage fromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 2.保存bitmap到图片

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImage imageWithCGImage:scaledImage];

}
复制代码

 

posted @   macroK  阅读(3868)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示