0

我在将滤镜应用于图像时遇到了一些问题。以下代码在使用 CIImage:imageWithContentsOfURL 时完美运行:

NSInteger filterIndex = [(UITapGestureRecognizer *)sender view].tag;
Filter *filter = [filters objectAtIndex:filterIndex];

CIContext *context = [CIContext contextWithOptions:nil];

CIImage *image = [CIImage imageWithContentsOfURL:[NSURL URLWithString:@"http://url.to/photo.jpg"]];

[filter.filter setValue:image forKey:kCIInputImageKey];

CIImage *result = [filter.filter valueForKey:kCIOutputImageKey];
CGRect extent = [result extent];
CGImageRef cgImage = [context createCGImage:result fromRect:extent];

[self.imageView setImage:[UIImage imageWithCGImage:cgImage]];

Filter 只是一个持有过滤器名称和 CIFilter 的模型:

-(id)initWithNameAndFilter:(NSString *)theName filter:(CIFilter *)theFilter;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) CIFilter *filter;

但是当我尝试使用以下代码加载本地 UIImage 时:

CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;

过滤后的图像只会变白(或消失)。我究竟做错了什么?

4

2 回答 2

3

问题是

[UIImage imageNamed:@"test.png"].CIImage

不做你认为它做的事。它不会将 UIImage 转换为 CIImage,也不会从 UIImage 派生 CIImage;它只是提供了对已经是此 UIImage 基础的 CIImage 的引用。但是这个 UIImage 没有CIImage基础;它是位图(CGImage),而不是过滤器输出(CIImage)。

这就是为什么,正如您正确发现的那样,您使用了另一种方法 CIImage's initWithCGImage:,它确实执行了转换。UIImage(正如我刚才所说)确实有一个 CGImage 基础,所以这是可行的。

换句话说, UIImage (大部分)只是一个wrapper。它可以是位图 (CGImage) 或过滤器输出 (CIImage) 的包装器。而这两种方法, CGImageand CIImage, 只是获取包装内容的方法;其中只有一个可以在任何给定的 UIImage 上工作,而且大部分时间都是CGImage.

于 2014-04-01T19:50:28.647 回答
0

Juraj Antas 在这个问题如何将 UIImage 转换为 CIImage 和反之亦然的回答解决了我的问题:

UIImage *u = [UIImage imageNamed:@"image.jpg"];
CIImage *image = [[CIImage alloc] initWithCGImage: u.CGImage];
于 2014-04-01T19:41:45.760 回答