2014-06-13 50 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被释放它足够稳定的我。 –