我在对图像应用滤镜时遇到一些问题。使用 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;
过滤后的图像仅变白(或消失)。我究竟做错了什么?
问题是
[UIImage imageNamed:@"test.png"].CIImage
并没有按照你的想法去做。它不会将 UIImage 转换为 CIImage,或从 UIImage 派生 CIImage;它仅提供对 CIImage 的引用already此 UIImage 的基础。但这个 UIImage 没有haveCIImage 基础;它是位图(CGImage),而不是滤镜输出(CIImage)。
这就是为什么,正如您所正确发现的,您使用了不同的方法,即 CIImage 的initWithCGImage:
, which does执行转换。 UIImage(正如我刚才所说)does有 CGImage 基础,所以这是可行的。
换句话说,UIImage(大部分)只是一个wrapper。它可以是位图 (CGImage) 或过滤器输出 (CIImage) 的包装器。而这两种方法,CGImage
and CIImage
,只是获取包装内容的方法;其中只有一个适用于任何给定的 UIImage,并且大多数情况下它会CGImage
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)