iOS 生成二维码~dome

   联系人:石虎 QQ:1224614774  昵称: 嗡嘛呢叭咪哄

                        QQ群:807236138  群称: iOS 技术交流学习群

 

代码实现

#import "SHCodeTableViewCell.h"

#import "SHQRCodeView.h" //导入生成二维码封装类名

@interface XHCFCodeTableViewCell()

//全局的二维码类名
@property(nonatomic,strong)SHQRCodeView *qrCodeView;

@end

@implementation SHCodeTableViewCell

- (void)viewDidLoad {
    [superviewDidLoad];

    //调用自定义创建二维码方法\添加二维码URL
    [self setCreateTwoDimensionalCode:@"http://blog.csdn.net/shihuboke"];

}

#pragma mark - 创建二维码
- (void)setCreateTwoDimensionalCode:(NSString *)stringCode 
{

    //1.初始化SHQRCodeView方法封装
    self.qrCodeView = [[SHQRCodeViewalloc]init];

    //2.生成一个CIImage的二维码,并且控制图片的大小
    UIImage *qrcode = [self.qrCodeView createNonInterpolatedUIImageFormCIImage:[self.qrCodeView createQRForString:stringCode]withSize:250.0f];

    //3.把CIImage二维码 添加到自定义的customQrcode图片中,并且设置颜色
    UIImage *customQrcode = [self.qrCodeViewimageBlackToTransparent:qrcodewithRed:60.0fandGreen:74.0fandBlue:89.0f];

    //4.用自定义customQrcode显示在界面上
    self.imageCode.image = customQrcode;

    //5.如果还想加上阴影,就在ImageView的Layer上使用下面代码添加阴影:
    //5.1 设置阴影的偏移量
    self.imageCode.layer.shadowOffset = CGSizeMake(0,2);
    //5.2 设置阴影的半径
    self.imageCode.layer.shadowRadius = 2;
    //5.3 设置阴影的颜色为黑色
    self.imageCode.layer.shadowColor = [UIColorblackColor].CGColor;
    //5.4 设置阴影的不透明度
    self.imageCode.layer.shadowOpacity = 3;

}

注意:以下的代码是自己封装好的生成二维码,只要把下面的. h和. m 文件复制到项目的类中即可.

如图片:    https://img-blog.csdn.net/20170602174259983?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpaHVib2tl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

 

     *************** 自封装的生成二维码类.h文件  *******************

//  Created by 石虎 on 16/5/10.
//  Copyright © 2016年 shih. All rights reserved.

#import <UIKit/UIKit.h>

@interface SHQRCodeView : UIView

/**
 因为生成的二维码是一个CIImage,我们直接转换成UIImage的话大小不好控制,所以使用下面方法返回需要大小的UIImage:

 */

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size ;

/**
 因为生成的二维码是黑白的,所以还要对二维码进行颜色填充,并转换为透明背景,使用遍历图片像素来更改图片颜色,

 */

- (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue;



/**

 首先是二维码的生成,使用CIFilter很简单,直接传入生成二维码的字符串即可:

 */

- (CIImage *)createQRForString:(NSString *)qrString;

@end


  *************** 自封装的生成二维码类.m文件  *******************


//  Created by 石虎 on 16/5/10.
//  Copyright © 2016年 shih. All rights reserved.
//


#import "SHQRCodeView.h"

@interface SHQRCodeView ()

@end

@implementation SHQRCodeView

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {

    CGRect extent =CGRectIntegral(image.extent);

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

    

    // 创建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 = [CIContextcontextWithOptions:nil];

    CGImageRef bitmapImage = [contextcreateCGImage:imagefromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef,kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    

    //保存bitmap到图片

    CGImageRef scaledImage =CGBitmapContextCreateImage(bitmapRef);

    

    // Cleanup

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImageimageWithCGImage:scaledImage];

}



- (CIImage *)createQRForString:(NSString *)qrString {

    

    //需要将字符串转换为UTF-8编码的NSData对象

    NSData *stringData = [qrStringdataUsingEncoding:NSUTF8StringEncoding];

    // 创建filter

    CIFilter *qrFilter = [CIFilterfilterWithName:@"CIQRCodeGenerator"];

    // 设置内容和纠错级别

    [qrFilter setValue:stringDataforKey:@"inputMessage"];

    [qrFilter setValue:@"M"forKey:@"inputCorrectionLevel"];

    

    // Send the image back

    return qrFilter.outputImage;

}





void ProviderReleaseData (void *info,constvoid *data,size_t size){

    free((void*)data);

}

- (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue{

    

    constint imageWidth = image.size.width;

    constint imageHeight = image.size.height;

    size_t      bytesPerRow = imageWidth *4;

    uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);

    

    // create context

    CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceRGB();

    CGContextRef context =CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight,8, bytesPerRow, colorSpace,

                                                 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;//0~255

            ptr[2] = green;

            ptr[1] = blue;

        }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, colorSpace,

                                        kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,

                                        NULL,true,kCGRenderingIntentDefault);

    CGDataProviderRelease(dataProvider);

    UIImage* resultUIImage = [UIImageimageWithCGImage:imageRef];

    // 清理空间

    CGImageRelease(imageRef);

    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    return resultUIImage;

}

谢谢!!!

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值