From 766efb663d0818aa00575eb5c20d945c6191f48d Mon Sep 17 00:00:00 2001 From: Jonathan Rose Date: Sun, 2 Jul 2017 17:28:19 +0300 Subject: [PATCH] qr code image --- QRCode.xcodeproj/project.pbxproj | 6 ++ QRCode/MDAppDelegate.m | 4 +- QRCode/QR/UIImage+MDQRCode.h | 1 + QRCode/QR/UIImage+MDQRCode.m | 160 ++++++++++++++++++------------- Resources/redButton.png | Bin 0 -> 23913 bytes 5 files changed, 102 insertions(+), 69 deletions(-) create mode 100644 Resources/redButton.png diff --git a/QRCode.xcodeproj/project.pbxproj b/QRCode.xcodeproj/project.pbxproj index a2e0a8b..c104091 100644 --- a/QRCode.xcodeproj/project.pbxproj +++ b/QRCode.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 31693FC71F0939F8000F9231 /* redButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 31693FC61F0939F8000F9231 /* redButton.png */; }; 52DC9B6E188D65A300272042 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52DC9B6D188D65A300272042 /* Foundation.framework */; }; 52DC9B70188D65A300272042 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52DC9B6F188D65A300272042 /* CoreGraphics.framework */; }; 52DC9B72188D65A300272042 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52DC9B71188D65A300272042 /* UIKit.framework */; }; @@ -43,6 +44,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 31693FC61F0939F8000F9231 /* redButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = redButton.png; sourceTree = ""; }; 52DC9B6A188D65A300272042 /* QRCode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QRCode.app; sourceTree = BUILT_PRODUCTS_DIR; }; 52DC9B6D188D65A300272042 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 52DC9B6F188D65A300272042 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -180,6 +182,7 @@ isa = PBXGroup; children = ( 52DC9B9D188D660C00272042 /* Default-568h@2x.png */, + 31693FC61F0939F8000F9231 /* redButton.png */, 52DC9B9E188D660C00272042 /* Default@2x.png */, 52DC9B9F188D660C00272042 /* Icon.png */, ); @@ -298,6 +301,7 @@ 52DC9BA2188D660C00272042 /* Icon.png in Resources */, 52DC9B80188D65A300272042 /* Images.xcassets in Resources */, 52DC9BA0188D660C00272042 /* Default-568h@2x.png in Resources */, + 31693FC71F0939F8000F9231 /* redButton.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -522,6 +526,7 @@ 52DC9B98188D65A300272042 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 52DC9B99188D65A300272042 /* Build configuration list for PBXNativeTarget "QRCodeTests" */ = { isa = XCConfigurationList; @@ -530,6 +535,7 @@ 52DC9B9B188D65A300272042 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/QRCode/MDAppDelegate.m b/QRCode/MDAppDelegate.m index aedcfe0..352ff0d 100644 --- a/QRCode/MDAppDelegate.m +++ b/QRCode/MDAppDelegate.m @@ -35,7 +35,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( CGFloat imageSize = ceilf(viewController.view.bounds.size.width * 0.6f); UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(floorf(viewController.view.bounds.size.width * 0.5f - imageSize * 0.5f), floorf(viewController.view.bounds.size.height * 0.5f - imageSize * 0.5f), imageSize, imageSize)]; [viewController.view addSubview:imageView]; - imageView.image = [UIImage mdQRCodeForString:@"Hello, world!" size:imageView.bounds.size.width fillColor:[UIColor darkGrayColor]]; +// imageView.image = [UIImage mdQRCodeForString:@"Hello, world!" size:imageView.bounds.size.width fillColor:[UIColor darkGrayColor]]; + imageView.image = [UIImage mdQRCodeForString:@"Hello, world!" size:imageView.bounds.size.width fillImage:[UIImage imageNamed:@"redButton"]]; + self.window.rootViewController = viewController; return YES; } diff --git a/QRCode/QR/UIImage+MDQRCode.h b/QRCode/QR/UIImage+MDQRCode.h index 052b4e3..820d404 100644 --- a/QRCode/QR/UIImage+MDQRCode.h +++ b/QRCode/QR/UIImage+MDQRCode.h @@ -33,6 +33,7 @@ */ + (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)size; + (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)size fillColor:(UIColor *)fillColor; ++ (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)size fillImage:(UIImage *)fillImage; @end diff --git a/QRCode/QR/UIImage+MDQRCode.m b/QRCode/QR/UIImage+MDQRCode.m index 01d9dcf..6dd44c4 100644 --- a/QRCode/QR/UIImage+MDQRCode.m +++ b/QRCode/QR/UIImage+MDQRCode.m @@ -28,82 +28,106 @@ @implementation UIImage (MDQRCode) #pragma mark - private -+ (void)mdDrawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size fillColor:(UIColor *)fillColor { - int margin = 0; - unsigned char *data = code->data; - int width = code->width; - int totalWidth = width + margin * 2; - int imageSize = (int)floorf(size); - - // @todo - review float->int stuff - int pixelSize = imageSize / totalWidth; - if (imageSize % totalWidth) { - pixelSize = imageSize / width; - margin = (imageSize - width * pixelSize) / 2; - } - - CGRect rectDraw = CGRectMake(0.0f, 0.0f, pixelSize, pixelSize); - // draw - CGContextSetFillColorWithColor(ctx, fillColor.CGColor); - for(int i = 0; i < width; ++i) { - for(int j = 0; j < width; ++j) { - if(*data & 1) { - rectDraw.origin = CGPointMake(margin + j * pixelSize, margin + i * pixelSize); - CGContextAddRect(ctx, rectDraw); - } - ++data; - } - } - CGContextFillPath(ctx); ++ (void)mdDrawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size fillImage:(UIImage *)fillImage orFillColor:(UIColor *)fillColor { + int margin = 0; + unsigned char *data = code->data; + int width = code->width; + int totalWidth = width + margin * 2; + int imageSize = (int)floorf(size); + + // @todo - review float->int stuff + int pixelSize = imageSize / totalWidth; + if (imageSize % totalWidth) { + pixelSize = imageSize / width; + margin = (imageSize - width * pixelSize) / 2; + } + + CGRect rectDraw = CGRectMake(0.0f, 0.0f, pixelSize, pixelSize); + // draw + if (fillColor) { + CGContextSetFillColorWithColor(ctx, fillColor.CGColor); + } + + for(int i = 0; i < width; ++i) { + for(int j = 0; j < width; ++j) { + if(*data & 1) { + rectDraw.origin = CGPointMake(margin + j * pixelSize, margin + i * pixelSize); + if (fillColor) { + CGContextAddRect(ctx, rectDraw); + }else if (fillImage) { + UIGraphicsPushContext(ctx); + [fillImage drawInRect:rectDraw]; + UIGraphicsPopContext(); + } + } + ++data; + } + } + CGContextFillPath(ctx); +} + ++ (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize boxImage:(UIImage *)fillImage orFillColor:(UIColor *)fillColor{ + + + if (0 == [qrString length]) { + return nil; + } + + // generate QR + QRcode *code = QRcode_encodeString([qrString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1); + if (!code) { + return nil; + } + + CGFloat size = imageSize * [[UIScreen mainScreen] scale]; + if (code->width > size) { + printf("Image size is less than qr code size (%d)\n", code->width); + return nil; + } + + // create context + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + + // The constants for specifying the alpha channel information are declared with the CGImageAlphaInfo type but can be passed to this parameter safely. + + CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); + + CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size); + CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1); + CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform)); + + // draw QR on this context + + [self mdDrawQRCode:code context:ctx size:size fillImage:fillImage orFillColor:fillColor]; + + + // get image + CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx); + UIImage * qrImage = [UIImage imageWithCGImage:qrCGImage]; + + // free memory + CGContextRelease(ctx); + CGImageRelease(qrCGImage); + CGColorSpaceRelease(colorSpace); + QRcode_free(code); + return qrImage; + } #pragma mark - public + + (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)size { - return [self mdQRCodeForString:qrString size:size fillColor:[UIColor blackColor]]; + return [self mdQRCodeForString:qrString size:size fillColor:[UIColor blackColor]]; } + (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize fillColor:(UIColor *)fillColor { - if (0 == [qrString length]) { - return nil; - } - - // generate QR - QRcode *code = QRcode_encodeString([qrString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1); - if (!code) { - return nil; - } - - CGFloat size = imageSize * [[UIScreen mainScreen] scale]; - if (code->width > size) { - printf("Image size is less than qr code size (%d)\n", code->width); - return nil; - } - - // create context - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - - // The constants for specifying the alpha channel information are declared with the CGImageAlphaInfo type but can be passed to this parameter safely. - - CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); - - CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size); - CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1); - CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform)); - - // draw QR on this context - [self mdDrawQRCode:code context:ctx size:size fillColor:fillColor]; - - // get image - CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx); - UIImage * qrImage = [UIImage imageWithCGImage:qrCGImage]; - - // free memory - CGContextRelease(ctx); - CGImageRelease(qrCGImage); - CGColorSpaceRelease(colorSpace); - QRcode_free(code); - return qrImage; + return [self mdQRCodeForString:qrString size:imageSize boxImage:nil orFillColor:fillColor]; + +} ++ (UIImage *)mdQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize fillImage:(UIImage *)fillImage{ + return [self mdQRCodeForString:qrString size:imageSize boxImage:fillImage orFillColor:nil]; } + @end diff --git a/Resources/redButton.png b/Resources/redButton.png new file mode 100644 index 0000000000000000000000000000000000000000..34bd32c50cf2c7cdab841aa3ce1a07175db18048 GIT binary patch literal 23913 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

V?@4Kuh8jz;<9)112;O_M9DxYjN5(F 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 literal 0 HcmV?d00001