2014-06-13 97 views
5

我正在嘗試爲OS X製作QR代碼生成器,但是我沒有繼續製作QRCode,該QRCode可以更豐富多彩,黑色和白色的我使用的CIImage過濾器將如何使這項工作我已經得到了我實現了我的應用程序的樣本代碼CIQRCodeGenerator: -如何更改CIFilter CIQRCodeGenerator過濾器的背景和前景色

+ (NSImage *)createQRImageForString:(NSString *)string size:(CGSize)size { 
// Setup the QR filter with our string 
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 
[filter setDefaults]; 

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
[filter setValue:data forKey:@"inputMessage"]; 
CIImage *image = [filter valueForKey:@"outputImage"]; 

// Calculate the size of the generated image and the scale for the desired image size 
CGRect extent = CGRectIntegral(image.extent); 
CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.height/CGRectGetHeight(extent)); 

// Since CoreImage nicely interpolates, we need to 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 = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 256*4, cs, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst); 

#if TARGET_OS_IPHONE 
CIContext *context = [CIContext contextWithOptions:nil]; 
#else 
CIContext *context = [CIContext contextWithCGContext:bitmapRef options:nil]; 
#endif 

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 [[NSImage alloc] initWithCGImage:scaledImage size:NSZeroSize]; 
} 

所以有人可以點我在正確的方向請。

回答

4

CIQRCodeGenerator只生成黑白兩色的QR碼,但您可以輕鬆地將生成的圖像轉換爲另一種配色方案。

創建CIFalseColor過濾器的實例,設置其inputImageoutputImage從你的產生,其inputColor0inputColor1你想使用的,而不是黑色和白色的顏色。然後將假彩色濾鏡的outputImage繪製到CG上下文中。

您也可以考慮使用CIMaskToAlpha過濾器將QR碼圖像中的黑色或白色變爲透明;那麼你就可以把它放在任何背景顏色上。 (不要把它放在太忙背景或人們將無法掃描。)

+0

即時猜測inputColor0是背景色和inputColor1是前景色 –

10

繼承人的作品現在代碼: -

+ (NSImage *)createQRImageForString:(NSString *)string backgroundColor:(CIColor*)iBackgroundColor foregroundColor:(CIColor*)iForegroundColor size:(CGSize)size { 

CIImage *image; 
CIFilter *filter; 
CIFilter *filterColor; 

// Setup the QR filter with our string 
filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 
[filter setDefaults]; 

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
[filter setValue:data forKey:@"inputMessage"]; 
image = [filter valueForKey:@"outputImage"]; 

filterColor = [CIFilter filterWithName:@"CIFalseColor" keysAndValues:@"inputImage", image, @"inputColor0", iForegroundColor, @"inputColor1", iBackgroundColor, nil]; 
//[filterColor setDefaults]; 

image = [filterColor valueForKey:@"outputImage"]; 


//image = [CIImage imageWithColor:[CIColor colorWithRed:1 green: 0 blue: 0]]; 

// Calculate the size of the generated image and the scale for the desired image size 
CGRect extent = CGRectIntegral(image.extent); 
CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.height/CGRectGetHeight(extent)); 

// Since CoreImage nicely interpolates, we need to 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 = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 256*4, cs, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst); 

#if TARGET_OS_IPHONE 
CIContext *context = [CIContext contextWithOptions:nil]; 
#else 
CIContext *context = [CIContext contextWithCGContext:bitmapRef options:nil]; 
#endif 

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 [[NSImage alloc] initWithCGImage:scaledImage size:NSZeroSize]; 
} 
+0

輝煌。感謝您發佈此信息。我希望你不介意我在我的Mac應用程序中使用這種方法。哦,也許這是我的天真,但不應該縮小圖像在您返回最終的NSImage之前發佈? –

+0

您的歡迎這些基本的東西需要暴露在互聯網上,讓更多的人瞭解像QR碼這樣的複雜方法。該方法仍然工作,沒有scaledImage被釋放它足夠穩定的我。 –

相關問題