美文网首页
iOS 生成二维码

iOS 生成二维码

作者: _悟了个空 | 来源:发表于2016-06-30 11:49 被阅读178次

    iOS7之后,可以使用原生的CIFilter创建二维码。

    一、生成二维码

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

    - (CIImage *)createQRForString:(NSString *)qrString {
        NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
        // 创建filter
        CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        // 设置内容和纠错级别
        [qrFilter setValue:stringData forKey:@"inputMessage"];
        [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
        // 返回CIImage
        return qrFilter.outputImage;
    }
    

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

    - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
        CGRect extent = CGRectIntegral(image.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:image fromRect:extent];
        CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
        CGContextScaleCTM(bitmapRef, scale, scale);
        CGContextDrawImage(bitmapRef, extent, bitmapImage);
        // 2.保存bitmap到图片
        CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
        CGContextRelease(bitmapRef);
        CGImageRelease(bitmapImage);
        //原图
        UIImage *outputImage = [UIImage imageWithCGImage:scaledImage];
        UIGraphicsBeginImageContextWithOptions(outputImage.size, NO, [[UIScreen mainScreen] scale]);
        [outputImage drawInRect:CGRectMake(0,0 , size, size)];
        //水印图
        UIImage *waterimage = [UIImage imageNamed:@"icon"];
        [waterimage drawInRect:CGRectMake((size-waterImagesize)/2.0, (size-waterImagesize)/2.0, waterImagesize, waterImagesize)];
        UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newPic;
    }
    

    设置图片透明度

    void ProviderReleaseData (void *info, const void *data, size_t size){ 
         free((void*)data);
    }
    - (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(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); 
     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 = [UIImage imageWithCGImage:imageRef]; 
    // 清理空间 
    CGImageRelease(imageRef); CGContextRelease(context); CGColorSpaceRelease(colorSpace); 
    return resultUIImage;
    }
    

    相关文章

      网友评论

          本文标题:iOS 生成二维码

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