生成二维码

来源:互联网 发布:jdbc mysql原理 编辑:程序博客网 时间:2024/05/15 08:39

生成二维码


- (void)viewDidLoad {

    [superviewDidLoad];

    

    self.imgView = [[UIImageViewalloc] initWithFrame:CGRectMake(20,20, 300, 300)];

   // imgView.backgroundColor = [UIColor redColor];

    [self.viewaddSubview: self.imgView];

    //创建过滤器

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

    //设置默认

    [filter setDefaults];

    //过滤器添加数据

    NSString * dataString =@"wlwlwlwlwlwlwll";

    NSData * data = [dataStringdataUsingEncoding:NSUTF8StringEncoding];

    [filter setValue:dataforKeyPath:@"inputMessage"];

    //获取输出的二维码

    CIImage * img = [filteroutputImage];

    //设置img的像素

    UIImage * img1 =[selfcreateNonInterpolatedUIImageFormCIImage:imgwithSize:1000];

    //设置img的颜色

    self.imgView.image = [self imageBlackToTransparent:img1 withRed:255andGreen:0andBlue:0];

}


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

- (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:image fromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef,kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 保存bitmap到图片

    CGImageRef scaledImage =CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImageimageWithCGImage:scaledImage];

}


//3.设置图片透明度

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{

    constint imageWidth = image.size.width;

    constint 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 = [UIImageimageWithCGImage:imageRef];

    // 清理空间

    CGImageRelease(imageRef);

    CGContextRelease(context);

    CGColorSpaceRelease(colorSpace);

    return resultUIImage;

}


0 0