美文网首页
生成二维码图片

生成二维码图片

作者: konglei | 来源:发表于2018-02-11 11:26 被阅读28次

SYCreateQRCode.h

#import <Foundation/Foundation.h>

@interfaceSYCreateQRCode :NSObject

/**

 生成二维码图片

 @param string 二维码包含的信息

 @return 生成的二维码拖图片

 */

+(UIImage*)createCodeImageWithString:(NSString*)string;

/**

 生成的二维码图片 使用iOS 7后的CIFilter对象操作,生成二维码图片imgQRCode(会拉伸图片,比较模糊,效果不佳)

 @param string 二维码包含的信息

 @return 生成的二维码图片

 */

+(CIImage*)createCIFileterCodeImageWithString:(NSString*)string;

/**

 使用核心绘图框架CG(Core Graphics)对象操作,进一步针对大小生成二维码图片imgAdaptiveQRCode(图片大小适合,清晰,效果好)

 Core Image提供了为图片分析常见缺陷并自动调整修复的方法. 提供一系列用来纠正这些不足的滤镜. 通过为滤镜预设相关值, 实现如变更色调, 饱合度, 对比度, 阴影, 去除红眼或其它闪光伪迹, 来提高图片的质量.

 @param image CIImage

 @param size 图片大小

 @return 生成的二维码图片

 */

+(UIImage*)createCodeImageWithImage:(CIImage*)image withSize:(CGFloat)size;

/**

 将默认产生的黑白色的二维码图片生成其它颜色的二维码图片

 @param image 二维码图片

 @param red 红色(0~255)

 @param green 绿色(0~255)

 @param blue 蓝色(0~255)

 @return 重新生成的二维码图片

 */

+(UIImage*)createCodeImageWithImage:(UIImage*)image withRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue;

//给二维码添加logo的2个方法

///使用核心绘图框架CG(Core Graphics)对象操作,合并二维码图片和用于中间显示的图标图片

/**

 自定义中间图标的大小

 @param image 生成的二维码图片

 @param icon 中间图片

 @param iconSize 图片的大小

 @return 合并后的二维码

 */

+ (UIImage*)addIconToCodeImage:(UIImage*)image withIcon:(UIImage*)icon withIconSize:(CGSize)iconSize;

/**

 按比例设置中间图片的大小

 @param image 生成的二维码图片

 @param icon 中间图片的大小

 @param scale 图片的比例 (原图/现图 = scale)

 @return 合并后的二维码

 */

+ (UIImage*)addIconToCodeImage:(UIImage*)image withIcon:(UIImage*)icon withScale:(CGFloat)scale;

@end

SYCreateQRCode.m

#import "SYCreateQRCode.h"

voidProviderReleaseData (void*info,constvoid*data,size_tsize){

    free((void*)data);

}

@implementation SYCreateQRCode

+(UIImage*)createCodeImageWithString:(NSString*)string{

    if([stringisEqualToString:@""]) {

        returnnil;

    }else{

        //二维码滤镜

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

        //恢复滤镜的默认属性

        [filtersetDefaults];

        //将字符串转换成NSData

        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

        //通过KVO设置滤镜inputMessage数据

        [filtersetValue:dataforKey:@"inputMessage"];

        //获得滤镜输出的图像

        CIImage*outImage = [filteroutputImage];

        //将CIImage转换成UIImage,并放大显示

        UIImage *image = [self createNonInterpolatedUIImageFormCIImage:outImage withSize:200];

        returnimage;

    }

}

+(CIImage*)createCIFileterCodeImageWithString:(NSString*)string{

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

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

    [filtersetValue:dataforKey:@"inputMessage"];

    [filtersetValue:@"Q" forKey:@"inputCorrectionLevel"]; //设置纠错等级越高;即识别越容易,值可设置为L(Low) |  M(Medium) | Q | H(High)

    returnfilter.outputImage;

}

+(UIImage*)createCodeImageWithImage:(CIImage*)image withSize:(CGFloat)size{

    CGRectextent =CGRectIntegral(image.extent);

    CGFloatscale =MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    size_twidth =CGRectGetWidth(extent) * scale;

    size_theight =CGRectGetHeight(extent) * scale;

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();

    CGContextRefcontextRef =CGBitmapContextCreate(nil, width, height,8,0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);

    CIContext*context = [CIContextcontextWithOptions:nil];

    CGImageRefimageRef = [contextcreateCGImage:imagefromRect:extent];

    CGContextSetInterpolationQuality(contextRef, kCGInterpolationNone);

    CGContextScaleCTM(contextRef, scale, scale);

    CGContextDrawImage(contextRef, extent, imageRef);

    CGImageRefimageRefResized =CGBitmapContextCreateImage(contextRef);

    //Release

    CGContextRelease(contextRef);

    CGImageRelease(imageRef);

    return[UIImageimageWithCGImage:imageRefResized];

}

+(UIImage*)createCodeImageWithImage:(UIImage*)image withRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue{

    constintimageWidth = image.size.width;

    constintimageHeight = image.size.height;

    size_tbytesPerRow = imageWidth *4;

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

    //Create context

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

    CGContextRef contextRef = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight,8, bytesPerRow, colorSpaceRef, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);

    CGContextDrawImage(contextRef, CGRectMake(0,0, imageWidth, imageHeight), image.CGImage);

    //Traverse pixe

    intpixelNum = imageWidth * imageHeight;

    uint32_t* pCurPtr = rgbImageBuf;

    for(inti =0; i < pixelNum; i++, pCurPtr++){

        if((*pCurPtr &0xFFFFFF00) <0x99999900){

            //Change color

            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;

        }

    }

    //      Convert to image

    CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight,ProviderReleaseData);

    CGImageRefimageRef =CGImageCreate(imageWidth, imageHeight,8,32, bytesPerRow, colorSpaceRef,kCGImageAlphaLast|kCGBitmapByteOrder32Little, dataProviderRef,NULL,true,kCGRenderingIntentDefault);

    CGDataProviderRelease(dataProviderRef);

    UIImage* img = [UIImageimageWithCGImage:imageRef];

    //Release

    CGImageRelease(imageRef);

    CGContextRelease(contextRef);

    CGColorSpaceRelease(colorSpaceRef);

    returnimg;

}

+(UIImage*)addIconToCodeImage:(UIImage*)image withIcon:(UIImage*)icon withIconSize:(CGSize)iconSize{

    UIGraphicsBeginImageContext(image.size);

    //通过两张图片进行位置和大小的绘制,实现两张图片的合并;其实此原理做法也可以用于多张图片的合并

    CGFloatwidthOfImage = image.size.width;

    CGFloatheightOfImage = image.size.height;

    CGFloatwidthOfIcon = iconSize.width;

    CGFloatheightOfIcon = iconSize.height;

    [imagedrawInRect:CGRectMake(0,0, widthOfImage, heightOfImage)];

    [icondrawInRect:CGRectMake((widthOfImage-widthOfIcon)/2, (heightOfImage-heightOfIcon)/2,widthOfIcon, heightOfIcon)];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    returnimg;

}

+(UIImage*)addIconToCodeImage:(UIImage*)image withIcon:(UIImage*)icon withScale:(CGFloat)scale{

    UIGraphicsBeginImageContext(image.size);

    //通过两张图片进行位置和大小的绘制,实现两张图片的合并;其实此原理做法也可以用于多张图片的合并

    CGFloatwidthOfImage = image.size.width;

    CGFloatheightOfImage = image.size.height;

    CGFloatwidthOfIcon = widthOfImage/scale;

    CGFloatheightOfIcon = heightOfImage/scale;

    [imagedrawInRect:CGRectMake(0,0, widthOfImage, heightOfImage)];

    [icondrawInRect:CGRectMake((widthOfImage-widthOfIcon)/2, (heightOfImage-heightOfIcon)/2,

                                widthOfIcon, heightOfIcon)];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    returnimg;

}

//改变二维码大小

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

    CGRectextent =CGRectIntegral(image.extent);

    CGFloatscale =MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    // 创建bitmap;

    size_twidth =CGRectGetWidth(extent) * scale;

    size_theight =CGRectGetHeight(extent) * scale;

    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();

    CGContextRefbitmapRef =CGBitmapContextCreate(nil, width, height,8,0, cs, (CGBitmapInfo)kCGImageAlphaNone);

    CIContext*context = [CIContextcontextWithOptions:nil];

    CGImageRefbitmapImage = [contextcreateCGImage:imagefromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 保存bitmap到图片

    CGImageRefscaledImage =CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return[UIImageimageWithCGImage:scaledImage];

}

@end

相关文章

网友评论

      本文标题:生成二维码图片

      本文链接:https://www.haomeiwen.com/subject/qempaxtx.html