【问题标题】:Problem clipping background to coreimage aztec generation with CIBlendWithMask使用 CIBlendWithMask 将背景裁剪到 coreimage aztec 生成的问题
【发布时间】:2021-05-12 10:18:43
【问题描述】:

我正在尝试将图像背景添加到生成的 atec 代码中,到目前为止,我可以生成 aztec 代码,但在使用 CIBlendWithMask 过滤器时遇到问题,我不确定我到底做错了什么我相信用户选择的背景作为 kCIInputBackgroundImageKey 是正确的,并且作为 kCIInputImageKey 的 aztec 输出图像是正确的,我认为我出错的地方是 kCIInputMaskImageKey 但不完全确定为什么我需要这样做我认为 aztec 输出将是一个足够的掩码图像 -我是否需要选择颜色或其他东西才能将背景剪辑到阿兹台克图像?

        CIFilter *aztecFilter = [CIFilter filterWithName:@"CIAztecCodeGenerator"];
        CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
        [aztecFilter setValue:stringData forKey:@"inputMessage"];
        
        [colorFilter setValue:aztecFilter.outputImage forKey:@"background"];
        
        NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"usertheme"];
        
        CIImage *image = [UIImage imageWithData:imageData].CIImage;


        
        [colorFilter setValue:[CIColor colorWithCGColor:[[UIColor blackColor] CGColor]] forKey:@"inputColor0"];
        [colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1 alpha:0] forKey:@"inputColor1"];
        
    
        
        
         CIFilter *blendFilter = [CIFilter filterWithName:@"CIBlendWithMask"];
         [blendFilter setValue:colorFilter.outputImage forKey:kCIInputImageKey];
         [blendFilter setValue:image forKey:kCIInputBackgroundImageKey];
         [blendFilter setValue:colorFilter.outputImage forKey:kCIInputMaskImageKey];

尝试创建类似的东西,但使用阿兹台克代码而不是 QR

【问题讨论】:

  • “为生成的阿兹台克代码添加图像背景” ...如果您显示“目标”图像的示例,将会有所帮助。
  • 现在添加到帖子中:)

标签: ios objective-c filter mask core-image


【解决方案1】:

你可能想多了……

您可以将CIBlendWithMask 过滤器仅用于背景图像和蒙版图像。

所以,如果我们从渐变图像开始(您可能会即时生成它):

然后生成Aztec Code图像(黄色轮廓只是为了显示框架):

我们可以使用该代码图像作为掩码。

这里是示例代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor systemYellowColor];
    
    // create a vertical stack view
    UIStackView *sv = [UIStackView new];
    sv.axis = UILayoutConstraintAxisVertical;
    sv.spacing = 8;
    sv.translatesAutoresizingMaskIntoConstraints = NO;
    
    [self.view addSubview:sv];
    
    // add 3 image views to the stack view
    for (int i = 0; i < 3; ++i) {
        UIImageView *imgView = [UIImageView new];
        [sv addArrangedSubview:imgView];
        [imgView.widthAnchor constraintEqualToConstant:240].active = YES;
        [imgView.heightAnchor constraintEqualToAnchor:imgView.widthAnchor].active = YES;
    }

    [self.view addSubview:sv];
    [sv.centerXAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.centerXAnchor].active = YES;
    [sv.centerYAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.centerYAnchor].active = YES;

    // load a gradient image for the background
    UIImage *gradientImage = [UIImage imageNamed:@"bkgGradient"];
    
    // put it in the first image view
    ((UIImageView *)sv.arrangedSubviews[0]).image = gradientImage;
    
    // create aztec filter
    CIFilter *aztecFilter = [CIFilter filterWithName:@"CIAztecCodeGenerator"];
    
    // give it some string data
    NSString *qrString = @"My string to encode";
    NSData *stringData = [qrString dataUsingEncoding: NSUTF8StringEncoding];
    [aztecFilter setValue:stringData forKey:@"inputMessage"];

    // get the generated aztec image
    CIImage *aztecCodeImage = aztecFilter.outputImage;

    // scale it to match the background gradient image
    float scaleX = gradientImage.size.width / aztecCodeImage.extent.size.width;
    float scaleY = gradientImage.size.height / aztecCodeImage.extent.size.height;
    
    aztecCodeImage = [[aztecCodeImage imageBySamplingNearest] imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];

    // convert to UIImage and set the middle image view
    UIImage *scaledCodeImage = [UIImage imageWithCIImage:aztecCodeImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    ((UIImageView *)sv.arrangedSubviews[1]).image = scaledCodeImage;

    // create a blend with mask filter
    CIFilter *blendFilter = [CIFilter filterWithName:@"CIBlendWithMask"];

    // set the background image
    CIImage *bkgInput = [CIImage imageWithCGImage:[gradientImage CGImage]];
    [blendFilter setValue:bkgInput forKey:kCIInputBackgroundImageKey];
    
    // set the mask image
    [blendFilter setValue:aztecCodeImage forKey:kCIInputMaskImageKey];
    
    // get the blended CIImage
    CIImage *output = [blendFilter outputImage];
    
    // convert to UIImage
    UIImage *blendedImage = [UIImage imageWithCIImage:output scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    
    // set the bottom image view to the result
    ((UIImageView *)sv.arrangedSubviews[2]).image = blendedImage;

}

产生:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2016-02-28
    • 1970-01-01
    • 2013-12-03
    • 2011-10-10
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多