Just a Computer Graphics Studio & My Life

已經可以從iOS SDK呼叫method來掃描QRCode,那麼是否也能從iOS SDK來產生 QRCode (QRCode Generator)

QRCode Generator.PNG

原來CoreImage Framework已能做到!

直接來看程式碼,把它寫成可重複使用的Library吧~


/**
 Theme: QRCode Generator
 IDE: Xcode 8
 Language: Objective C
 Date: 106/08/17
 Author: HappyMan
 Blog: https://cg2010studio.com/
 */

// .h檔

#import <Foundation/Foundation.h>

@interface SDQRCodeGenerator : NSObject

+(UIImage *)qrCodeWithString:(NSString *)string width:(CGFloat)width;

@end

// .m檔

#import "SDQRCodeGenerator.h"
#import <CoreImage/CoreImage.h>

@implementation SDQRCodeGenerator

+(UIImage *)qrCodeWithString:(NSString *)string width:(CGFloat)width
{
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [filter setDefaults];
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKey:@"inputMessage"];
    CIImage *outputImage = [filter outputImage];
    return [self createNonInterpolatedImageFromCIImage:outputImage withSize:width];
}

+(UIImage *)createNonInterpolatedImageFromCIImage:(CIImage *)image withSize:(CGFloat)size
{
    CGFloat screenScale = [[UIScreen mainScreen] scale];
    CGRect extent = image.extent;
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    size_t width = scale * CGRectGetWidth(extent);
    size_t height = scale * CGRectGetHeight(extent);

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, screenScale);
    CGContextRef bitmapContextRef = UIGraphicsGetCurrentContext();

    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
    CGContextSetInterpolationQuality(bitmapContextRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapContextRef, scale, scale);
    CGContextDrawImage(bitmapContextRef, extent, bitmapImage);
    UIImage *retVal =  UIGraphicsGetImageFromCurrentImageContext();
    CGImageRelease(bitmapImage);
    CGContextRelease(bitmapContextRef);
    return retVal;
}

// 使用方式
    qrCodeImageView.image = [SDQRCodeGenerator qrCodeWithString:@"Happy Girl" width:qrCodeImageView.frame.size.width];

現在超商很常掃描QR Code或Bar Code,這樣就不必記複雜的代碼囉~

之前開發過好幾支超商百貨公司的App,這個已是必備功能!

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: