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

生成二维码图片

作者: 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