微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 CIBlendWithMask

如何解决使用 CIBlendWithMask

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

        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];

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

see picture here

解决方法

你可能想得太多了...

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

因此,如果我们从渐变图像开始(您可能正在即时生成它):

enter image description here

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

enter image description here

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

这是示例代码:

- (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;

}

产生:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。