在CIFilter中使用来自CIColor的CIImage:获取空图像 [英] Using a CIImage from CIColor in a CIFilter: getting empty image

查看:378
本文介绍了在CIFilter中使用来自CIColor的CIImage:获取空图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用混合模式创建CIFilter(如叠加或乘法)。相关代码:

I'm trying to create a CIFilter with blend mode (like overlay or multiply). Relevant code:

// Let's try a filter here
// Get the data
NSData *imageData = UIImageJPEGRepresentation(image, 0.85);
// Create a CI Image
CIImage *beginImage = [CIImage imageWithData:imageData];
CIImage *overlay = [CIImage imageWithColor:[CIColor colorWithRed:0.7 green:0.75 blue:0.9 alpha:0.75]];
// Create a context
CIContext *context = [CIContext contextWithOptions:nil];
// Create filter
CIFilter *filter = [CIFilter filterWithName:@"CIOverlayBlendMode" 
                                  keysAndValues:@"inputImage", beginImage,
                                                @"inputBackgroundImage", overlay,
                                                nil];

其他过滤器工作正常(如棕褐色调),但过滤器需要inputBackgroundImage键,我得到一个空白/空结果......所以我的背景图像似乎有些问题。

Other filters are working okay (like sepia tone), but with a filter that requires a "inputBackgroundImage" key, I get a blank/empty result ... so something seems to be wrong with my background image.

如何通过在图像上放置纯色来使用混合模式滤镜?

How do I use a blend mode filter by placing a solid color over an image?

推荐答案

在主题入门代码中没问题,只需要一个修复。

Its okay in topic starter's code, only one fix should be.

NSData *imageData = UIImageJPEGRepresentation(image, 0.85);
// Create a CI Image
CIImage *beginImage = [CIImage imageWithData:imageData];
CIImage *overlay = [CIImage imageWithColor:[CIColor colorWithRed:0.7 green:0.75 blue:0.9 alpha:0.75]];

//You should crop the generated image to beginImage size because generated image's size is infinite. I don't know why, but CIOverlayBlendMode isn't tolerant to infinite size
    overlay = [overlay imageByCroppingToRect:CGRectMake(beginImage.extent.origin.x, beginImage.extent.origin.y, beginImage.extent.size.width, beginImage.extent.size.height)];

// Create a context
CIContext *context = [CIContext contextWithOptions:nil];
// Create filter
CIFilter *filter = [CIFilter filterWithName:@"CIOverlayBlendMode" 
                                      keysAndValues:@"inputImage", beginImage,
                                                    @"inputBackgroundImage", overlay,
                                                    nil];

这篇关于在CIFilter中使用来自CIColor的CIImage:获取空图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆