您的位置:首页 > 移动开发 > IOS开发

ios7 二维码图片生成

2015-08-01 15:49 513 查看
转自: https://github.com/TelenLiu/Demo_CustomQRCode
@interface ViewController ()
@property (strong,
nonatomic) IBOutlet
UIImageView *qrcodeView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIImage *qrcode = [self
createNonInterpolatedUIImageFormCIImage:[self
createQRForString:@"http://blog.yourtion.com"]
withSize:250.0f];
UIImage *customQrcode = [self
imageBlackToTransparent:qrcode
withRed:60.0f
andGreen:74.0f
andBlue:89.0f];
self.qrcodeView.image = customQrcode;
// set shadow
self.qrcodeView.layer.shadowOffset
= CGSizeMake(0,
2);
self.qrcodeView.layer.shadowRadius
= 2;
self.qrcodeView.layer.shadowColor
= [UIColor blackColor].CGColor;
self.qrcodeView.layer.shadowOpacity
= 0.5;
}

- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - InterpolatedUIImage
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat)
size {
CGRect extent =
CGRectIntegral(image.extent);
CGFloat scale =
MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// create a bitmap image that we'll draw into a bitmap context at the desired size;
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);
// Create an image with the contents of our bitmap
CGImageRef scaledImage =
CGBitmapContextCreateImage(bitmapRef);
// Cleanup
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage
imageWithCGImage:scaledImage];
}

#pragma mark - QRCodeGenerator
- (CIImage *)createQRForString:(NSString *)qrString {
// Need to convert the string to a UTF-8 encoded NSData object
NSData *stringData = [qrString
dataUsingEncoding:NSUTF8StringEncoding];
// Create the filter
CIFilter *qrFilter = [CIFilter
filterWithName:@"CIQRCodeGenerator"];
// Set the message content and error-correction level
[qrFilter setValue:stringData
forKey:@"inputMessage"];
[qrFilter setValue:@"M"
forKey:@"inputCorrectionLevel"];
// Send the image back
return qrFilter.outputImage;
}

#pragma mark - imageToTransparent
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);
// create context
CGColorSpaceRef colorSpace =
CGColorSpaceCreateDeviceRGB();
CGContextRef context =
CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight,
8, bytesPerRow, colorSpace,

kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context,
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;
}
}
// context to image
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];
// release
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return resultUIImage;
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: