@interface MyQR_codeViewController ()
@property(nonatomic,strong)UIImageView *myQRImageView;
@end
@implementation MyQR_codeViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIImageView *bgView = [[UIImageView alloc] initWithFrame:self.view.bounds];
//设置默认的背景
bgView.image = [UIImage imageNamed:@"homeback1.png"];
[self.view addSubview:bgView];
//生成我的二维码
[self createMyQR_code];
}
-(void)createMyQR_code{
self.myQRImageView = [[UIImageView alloc]initWithFrame:(CGRectMake(30, (MyQRSize.height - MyQRSize.width - 50)/2 , MyQRSize.width - 60 , MyQRSize.width - 60))];
[self.view addSubview:self.myQRImageView];
//1.0 创建滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
//2.0 给滤镜添加数据
NSString *dataString = [NSString stringWithFormat:@"http://www.mrchabo.com/api/customer/register/page.do?skip_url=http://www.mrchabo.com/api/v2/app/client.do&referrer_id=%@",self.userId];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
//3.0 获取输出的二维码图片(CIImage类型)
CIImage *outImage = [filter outputImage];
//4.0 重绘二维码图片
self.myQRImageView.image = [self createNonInterpolatedUIImageFormCIImage:outImage size:500];
}
//4.0 重绘二维码图片
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)ciImage size:(CGFloat)widthAndHeight
{
CGRect extentRect = CGRectIntegral(ciImage.extent);
CGFloat scale = MIN(widthAndHeight / CGRectGetWidth(extentRect), widthAndHeight / CGRectGetHeight(extentRect));
// 1.0 创建bitmap;
size_t width = CGRectGetWidth(extentRect) * scale;
size_t height = CGRectGetHeight(extentRect) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:ciImage fromRect:extentRect];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extentRect, bitmapImage);
// 2.0 保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
// 3.0 返回图片
// 3.0.1 返回 背景白色 二维码颜色黑色
// return [UIImage imageWithCGImage:scaledImage]; // 返回黑白图片
// 3.0.2 返回 背景透明 二维码颜色设置
UIImage *newImage = [UIImage imageWithCGImage:scaledImage];
return [self imageBlackToTransparent:newImage withRed:200.0f andGreen:70.0f andBlue:189.0f];
}
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;
//每次生成的二维码颜色不一样
red = arc4random()/256;
green = arc4random()/256;
blue = arc4random()/256;
for (int i = 0; i < pixelNum; i++, pCurPtr++){
if ((*pCurPtr & 0xFFFFFF00) < 0x99999900) // 将白色变成透明
{
// 改成下面的代码,会将图片转成想要的颜色
uint8_t* ptr = (uint8_t*)pCurPtr;
ptr[3] = red; //0~255
ptr[1] = green;
ptr[2] = 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;
}
转载于:https://my.oschina.net/ArtemisFang/blog/653621