You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.9 KiB
89 lines
2.9 KiB
// |
|
// QR Code Generator - generates UIImage from NSString |
|
// |
|
// Copyright (C) 2012 http://moqod.com Andrew Kopanev <andrew@moqod.com> |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|
// of this software and associated documentation files (the "Software"), to deal |
|
// in the Software without restriction, including without limitation the rights |
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
|
// of the Software, and to permit persons to whom the Software is furnished to do so, |
|
// subject to the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included in all |
|
// copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE |
|
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
// DEALINGS IN THE SOFTWARE. |
|
// |
|
|
|
#import "QRCodeGenerator.h" |
|
#import "qrencode.h" |
|
|
|
enum { |
|
qr_margin = 3 |
|
}; |
|
|
|
@implementation QRCodeGenerator |
|
|
|
+ (void)drawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size { |
|
unsigned char *data = 0; |
|
int width; |
|
data = code->data; |
|
width = code->width; |
|
float zoom = (double)size / (code->width + 2.0 * qr_margin); |
|
CGRect rectDraw = CGRectMake(0, 0, zoom, zoom); |
|
|
|
// draw |
|
CGContextSetFillColor(ctx, CGColorGetComponents([UIColor blackColor].CGColor)); |
|
for(int i = 0; i < width; ++i) { |
|
for(int j = 0; j < width; ++j) { |
|
if(*data & 1) { |
|
rectDraw.origin = CGPointMake((j + qr_margin) * zoom,(i + qr_margin) * zoom); |
|
CGContextAddRect(ctx, rectDraw); |
|
} |
|
++data; |
|
} |
|
} |
|
CGContextFillPath(ctx); |
|
} |
|
|
|
+ (UIImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size { |
|
if (![string length]) { |
|
return nil; |
|
} |
|
|
|
QRcode *code = QRcode_encodeString([string UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1); |
|
if (!code) { |
|
return nil; |
|
} |
|
|
|
// create context |
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); |
|
CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, kCGImageAlphaPremultipliedLast); |
|
|
|
CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size); |
|
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1); |
|
CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform)); |
|
|
|
// draw QR on this context |
|
[QRCodeGenerator drawQRCode:code context:ctx size:size]; |
|
|
|
// get image |
|
CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx); |
|
UIImage * qrImage = [UIImage imageWithCGImage:qrCGImage]; |
|
|
|
// some releases |
|
CGContextRelease(ctx); |
|
CGImageRelease(qrCGImage); |
|
CGColorSpaceRelease(colorSpace); |
|
QRcode_free(code); |
|
|
|
return qrImage; |
|
} |
|
|
|
@end
|
|
|