生成二维码

    xiaoxiao2021-03-25  192

    CreateCode.h

    #import <Foundation/Foundation.h>

    @interface CreateCode : NSObject

    /**

     生成二维码图片

     @param string 二维码包含的信息

     @return 生成的二维码拖图片

     */

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

    /**

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

     @param string 二维码包含的信息

     @return 生成的二维码图片

     */

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

    /**

     使用核心绘图框架CGCore 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;

    //给二维码添加logo2个方法

    ///使用核心绘图框架CGCore 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

    CreateCode.m

    #import "CreateCode.h"

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

        free((void*)data);

    }

    @implementation CreateCode

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

        if ([string isEqualToString:@""]) {

            return nil;

        }else{

        //二维码滤镜

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

        //恢复滤镜的默认属性

            [filter setDefaults];

        //将字符串转换成NSData

            NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

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

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

        //获得滤镜输出的图像

            CIImage *outImage = [filter outputImage];

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

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

            return image;

        }

    }

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

        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

        

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

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

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

        return filter.outputImage;

    }

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

        CGRect extent = CGRectIntegral(image.extent);

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

        size_t width = CGRectGetWidth(extent) * scale;

        size_t height = CGRectGetHeight(extent) * scale;

        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();

        

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

        CIContext *context = [CIContext contextWithOptions:nil];

        CGImageRef imageRef = [context createCGImage:image fromRect:extent];

        CGContextSetInterpolationQuality(contextRef, kCGInterpolationNone);

        CGContextScaleCTM(contextRef, scale, scale);

        CGContextDrawImage(contextRef, extent, imageRef);

        

        CGImageRef imageRefResized = CGBitmapContextCreateImage(contextRef);

        

        //Release

        CGContextRelease(contextRef);

        CGImageRelease(imageRef);

        return [UIImage imageWithCGImage:imageRefResized];

    }

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

        const int imageWidth = image.size.width;

        const int imageHeight = image.size.height;

        size_t bytesPerRow = 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

        int pixelNum = imageWidth * imageHeight;

        uint32_t* pCurPtr = rgbImageBuf;

        for (int i = 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);

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

        CGDataProviderRelease(dataProviderRef);

        UIImage* img = [UIImage imageWithCGImage:imageRef];

        

        //Release

        CGImageRelease(imageRef);

        CGContextRelease(contextRef);

        CGColorSpaceRelease(colorSpaceRef);

        

        return img;

    }

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

        UIGraphicsBeginImageContext(image.size);

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

        CGFloat widthOfImage = image.size.width;

        CGFloat heightOfImage = image.size.height;

        CGFloat widthOfIcon = iconSize.width;

        CGFloat heightOfIcon = iconSize.height;

        

        [image drawInRect:CGRectMake(0, 0, widthOfImage, heightOfImage)];

        

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

        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

        

        UIGraphicsEndImageContext();

        return img;

    }

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

        UIGraphicsBeginImageContext(image.size);

        

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

        CGFloat widthOfImage = image.size.width;

        CGFloat heightOfImage = image.size.height;

        CGFloat widthOfIcon = widthOfImage/scale;

        CGFloat heightOfIcon = heightOfImage/scale;

        

        [image drawInRect:CGRectMake(0, 0, widthOfImage, heightOfImage)];

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

                                    widthOfIcon, heightOfIcon)];

        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

        

        UIGraphicsEndImageContext();

        return img;

    }

    //改变二维码大小

    + (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 = [CIContext contextWithOptions:nil];

        CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];

        CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

        CGContextScaleCTM(bitmapRef, scale, scale);

        CGContextDrawImage(bitmapRef, extent, bitmapImage);

        // 保存bitmap到图片

        CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

        CGContextRelease(bitmapRef);

        CGImageRelease(bitmapImage);

        return [UIImage imageWithCGImage:scaledImage];

    }

    @end

    转载请注明原文地址: https://ju.6miu.com/read-2444.html

    最新回复(0)