【问题标题】:Colorwithpattern for coreimage colorColor With Pattern 用于核心图像颜色
【发布时间】:2021-05-12 01:26:02
【问题描述】:

我正在使用 CIAztecCodeGenerator 生成 Aztec 代码。

我正在尝试为它的前景色设置一个图案而不是纯色,但是它呈现为空白/白色我想知道是否有人知道我做错了什么。

[colorFilter setValue:[CIColor colorWithCGColor:[[UIColor colorWithPatternImage:image] CGColor]] forKey:@"inputColor0"];

【问题讨论】:

  • 欢迎您!恐怕 Core Image 不支持图案颜色,只支持 RGBA 值。你想达到什么效果?
  • 啊,真烦人!我正在尝试允许将用户选择的图像用作阿兹台克代码前色的图案。我想没有办法解决这个问题。有什么方法可以将阿兹台克代码用作掩码,我可以将用户选择的图像“剪辑”成可能吗?

标签: ios objective-c uicolor core-image cgcolor


【解决方案1】:

这有点复杂,但您可以通过以某种方式组合和混合图像来使用自定义模式:

import CoreImage.CIFilterBuiltins // needed for using the type-safe filter interface

// ...

let patternImage = UIImage(named: "<image_name>")!
var patternInput = CIImage(cgImage: patternImage.cgImage!)

// potentially scale the pattern image
patternInput = patternInput.transformed(by: CGAffineTransform(scaleX: 0.5, y: 0.5))

let codeFilter = CIFilter.aztecCodeGenerator()
codeFilter.message = "<message>".data(using: .utf8)!
var codeImage = codeFilter.outputImage!

// invert code so the actual code part is white
let colorInvertFilter = CIFilter.colorInvert()
colorInvertFilter.inputImage = codeImage
codeImage = colorInvertFilter.outputImage!

// potentially scale the barcode (using nearest sampling to retain sharp edges)
codeImage = codeImage.samplingNearest().transformed(by: CGAffineTransform(scaleX: 50, y: 50))

let blendFilter = CIFilter.blendWithMask()
blendFilter.inputImage = patternInput
// using white color as background here, but can be any (or transparent when alpha = 0)
blendFilter.backgroundImage = CIImage(color: CIColor.white).cropped(to: codeImage.extent)
blendFilter.maskImage = codeImage

let output = blendFilter.outputImage!

Objective-C 版本:

// the image containing the pattern you want to show over the aztec code
CIImage *patternImage = [CIImage imageWithData:imageData];

// potentially scale the pattern image, if necessary
patternImage = [patternImage imageByApplyingTransform:CGAffineTransformMakeScale(0.5, 0.5)];

// generate aztec code image
CIFilter *qrFilter = [CIFilter filterWithName:@"CIAztecCodeGenerator"];
[qrFilter setValue:stringData forKey:@"inputMessage"];
CIImage *codeImage = qrFilter.outputImage;

// invert code so the actual code part is white (used for masking below)
codeImage = [codeImage imageByApplyingFilter: @"CIColorInvert"];

// potentially scale the aztec code (using nearest sampling to retain sharp edges)
codeImage = [[codeImage imageBySamplingNearest] imageByApplyingTransform:CGAffineTransformMakeScale(50, 50)];

// the background color for your aztec code; basically a solid color image of the same size of the code
CIImage *background = [[CIImage imageWithColor:[CIColor whiteColor]] imageByCroppingToRect:codeImage.extent];

//
CIFilter *blendFilter = [CIFilter filterWithName:@"CIBlendWithMask"];
[blendFilter setValue:patternImage forKey:@"inputImage"]; // the pattern image is in the foreground
[blendFilter setValue:background forKey:@"backgroundImage"]; // solid color in the aztec code, but could be any color or image
[blendFilter setValue:codeImage forKey:@"maskImage"]; // use the aztec code as a mask for the pattern image over the background

CIImage *output = blendFilter.outputImage

请注意,两个缩放步骤中的数字取决于您想要显示代码的大小以及图案图像应如何在代码上方缩放。

【讨论】:

  • 在 Objective C 中这可能实现吗?
  • 是的,当然。所有这些 API 在 Objective-C 中也可用。
  • 太棒了,到目前为止我有这个:CIImage image = [UIImage imageWithData:imageData].CIImage; [colorFilter setValue:[CIColor colorWithCGColor:[[UIColor blackColor] CGColor]] forKey:@"inputColor0"]; CIFilter *colorFilter = [CIFilter filterWithName:@"CIBlendWithMask"]; CIImage outputx = colorFilter.outputImage; [colorFilter setValue:outputx forKey:kCIInputImageKey]; [colorFilter setValue:image forKey:kCIInputMaskImageKey]; [colorFilter setValue:outputx forKey:kCIInputBackgroundImageKey];
  • 我认为我缺少的是从您的行中裁剪到的部分: blendFilter.backgroundImage = CIImage(color: CIColor.white).cropped(to: codeImage.extent) 你知道吗?对象等效?
  • 应该是blendFilter.backgroundImage = [[CIImage imageWithColor:[CIColor blackColor]] imageByCroppingToRect:codeImage.extent]
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多