自定义二维码的生成

用系统的框架写的代码, 可以改变二维码的大小和颜色

  1 #import "ViewController.h"
  2 
  3  
  4 
  5 @interface ViewController ()
  6 
  7 @property (strong, nonatomic) IBOutlet UIImageView *qrcodeView;
  8 
  9 @property (nonatomic, strong) UIImageView *pictureView;
 10 
 11  
 12 
 13 @end
 14 
 15  
 16 
 17 @implementation ViewController
 18 
 19             
 20 
 21 - (void)viewDidLoad {
 22 
 23     [super viewDidLoad];
 24 
 25     // Do any additional setup after loading the view, typically from a nib.
 26 
 27     // 创建二维码图片
 28 
 29     UIImage *qrcode = [self createNonInterpolatedUIImageFormCIImage:[self createQRForString:@"http://www.cnblogs.com/lurenq/p/5338576.html"] withSize:250.0f];
 30 
 31     // 自定义二维码的颜色
 32 
 33     UIImage *customQrcode = [self imageBlackToTransparent:qrcode withRed:0.0f andGreen:0.0f andBlue:255.0f];
 34 
 35     self.qrcodeView.image = customQrcode;
 36 
 37     // set shadow
 38 
 39     self.qrcodeView.layer.shadowOffset = CGSizeMake(0, 2);
 40 
 41     self.qrcodeView.layer.shadowRadius = 2;
 42 
 43     self.qrcodeView.layer.shadowColor = [UIColor blackColor].CGColor;
 44 
 45     self.qrcodeView.layer.shadowOpacity = 0.5;
 46 
 47     
 48 
 49     // 添加标识图片
 50 
 51     self.pictureView = [[UIImageView alloc] init];
 52 
 53     self.pictureView.frame  = CGRectMake(100, 100, 50, 50);
 54 
 55     // icon , 不影响扫描
 56 
 57     self.pictureView.image = [UIImage imageNamed:@"1"];
 58 
 59     [self.qrcodeView addSubview:self.pictureView];
 60 
 61     
 62 
 63     
 64 
 65 }
 66 
 67  
 68 
 69  
 70 
 71 - (void)didReceiveMemoryWarning {
 72 
 73     [super didReceiveMemoryWarning];
 74 
 75     // Dispose of any resources that can be recreated.
 76 
 77 }
 78 
 79  
 80 
 81 #pragma mark - InterpolatedUIImage
 82 
 83 - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
 84 
 85     CGRect extent = CGRectIntegral(image.extent);
 86 
 87     CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
 88 
 89     // create a bitmap image that we'll draw into a bitmap context at the desired size;
 90 
 91     size_t width = CGRectGetWidth(extent) * scale;
 92 
 93     size_t height = CGRectGetHeight(extent) * scale;
 94 
 95     CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
 96 
 97     CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
 98 
 99     CIContext *context = [CIContext contextWithOptions:nil];
100 
101     CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
102 
103     CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
104 
105     CGContextScaleCTM(bitmapRef, scale, scale);
106 
107     CGContextDrawImage(bitmapRef, extent, bitmapImage);
108 
109     // Create an image with the contents of our bitmap
110 
111     CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
112 
113     // Cleanup
114 
115     CGContextRelease(bitmapRef);
116 
117     CGImageRelease(bitmapImage);
118 
119     return [UIImage imageWithCGImage:scaledImage];
120 
121 }
122 
123  
124 
125 #pragma mark - QRCodeGenerator
126 
127 - (CIImage *)createQRForString:(NSString *)qrString {
128 
129     // Need to convert the string to a UTF-8 encoded NSData object
130 
131     NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
132 
133     // Create the filter
134 
135     CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
136 
137     // Set the message content and error-correction level
138 
139     [qrFilter setValue:stringData forKey:@"inputMessage"];
140 
141     [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
142 
143     // Send the image back
144 
145     return qrFilter.outputImage;
146 
147 }
148 
149  
150 
151 #pragma mark - imageToTransparent
152 
153 void ProviderReleaseData (void *info, const void *data, size_t size){
154 
155     free((void*)data);
156 
157 }
158 
159 - (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue{
160 
161     const int imageWidth = image.size.width;
162 
163     const int imageHeight = image.size.height;
164 
165     size_t      bytesPerRow = imageWidth * 4;
166 
167     uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
168 
169     // create context
170 
171     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
172 
173     CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
174 
175                                                  kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
176 
177     CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
178 
179     // traverse pixe
180 
181     int pixelNum = imageWidth * imageHeight;
182 
183     uint32_t* pCurPtr = rgbImageBuf;
184 
185     for (int i = 0; i < pixelNum; i++, pCurPtr++){
186 
187         if ((*pCurPtr & 0xFFFFFF00) < 0x99999900){
188 
189             // change color
190 
191             uint8_t* ptr = (uint8_t*)pCurPtr;
192 
193             ptr[3] = red; //0~255
194 
195             ptr[2] = green;
196 
197             ptr[1] = blue;
198 
199         }else{
200 
201             uint8_t* ptr = (uint8_t*)pCurPtr;
202 
203             ptr[0] = 0;
204 
205         }
206 
207     }
208 
209     // context to image
210 
211     CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
212 
213     CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace,
214 
215                                         kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
216 
217                                         NULL, true, kCGRenderingIntentDefault);
218 
219     CGDataProviderRelease(dataProvider);
220 
221     UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
222 
223     // release
224 
225     CGImageRelease(imageRef);
226 
227     CGContextRelease(context);
228 
229     CGColorSpaceRelease(colorSpace);
230 
231     return resultUIImage;
232 
233 }
234 
235 @end
236 
237  

 

posted @ 2016-03-30 19:46  路人Q  阅读(446)  评论(0编辑  收藏  举报