Jos*_*ill 6 objective-c core-image uiimage ios cifilter
当我尝试将过滤器应用于我的用户选择时,我的应用程序崩溃了UIImage(它在没有应用过滤器的情况下工作正常).我添加了"CoreImage"框架并将其导入到我的项目中,因此我可以为用户选择的图像创建过滤器.
我试图通过创建一个类别UIImage(基于Apple的文档,然后调用UIImage用户选择的相应方法)来应用过滤器.以下是我的类别标题和正文的代码;我做错了什么?(请请注意,"randColor"是一种UIColor生成随机颜色的类别类方法
#import <UIKit/UIKit.h>
#import <CoreImage/CoreImage.h>
#import "UIColor+CustomColorCategory.h"
@interface UIImage (MonoChromeFilter)
- (UIImage *) applyMonoChromeWithRandColor;
@end
#import "UIImage+MonoChromeFilter.h"
@implementation UIImage (MonoChromeFilter)
- (UIImage *)applyMonoChromeWithRandColor
{
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *ciImage = [[CIImage alloc] initWithImage:self];
CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:[UIColor randColor] forKey:kCIAttributeTypeColor];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
CGRect extent = [result extent];
CGImageRef cgImage = [context createCGImage:result fromRect:extent];
UIImage *filteredImage = [[UIImage alloc] initWithCGImage:cgImage];
return filteredImage;
}
@end
Run Code Online (Sandbox Code Playgroud)
以下是viewController调用此类别的方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:^{
UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
editedImage = [editedImage applyMonoChromeWithRandColor];
self.blogImageOutlet.image = editedImage;
self.blogImageOutlet.layer.cornerRadius = self.blogImageOutlet.frame.size.width / 2.0;
[self.blogImageOutlet setClipsToBounds:YES];
[self saveImageToLibrary:editedImage];
}];
}
Run Code Online (Sandbox Code Playgroud)
我想到了!在调试并使用其他一些项目作为参考之后,我意识到我遇到了两个问题.首先,我试图使用UIColor进行CIColor,这不是直接可行的.我首先必须将UIColor转换为CIColor以便能够应用它.接下来,我没有使用正确的字符串作为CIFilter值键.以下是修改后的代码(现在可以使用!)
#import "UIImage+MonoChromeFilter.h"
@implementation UIImage (MonoChromeFilter)
+ (UIImage *) applyMonoChromeWithRandColor: (UIImage *)uIImage
{
// Convert UIColor to CIColor
CGColorRef colorRef = [UIColor randColor].CGColor;
NSString *colorString = [CIColor colorWithCGColor:colorRef].stringRepresentation;
CIColor *coreColor = [CIColor colorWithString:colorString];
CIContext *context = [CIContext contextWithOptions:nil];
// Convert UIImage to CIImage
CIImage *ciImage = [[CIImage alloc] initWithImage:uIImage];
// Set values for CIColorMonochrome Filter
CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:@1.0 forKey:@"inputIntensity"];
[filter setValue:coreColor forKey:@"inputColor"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
CGRect extent = [result extent];
CGImageRef cgImage = [context createCGImage:result fromRect:extent];
UIImage *filteredImage = [[UIImage alloc] initWithCGImage:cgImage];
return filteredImage;
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7647 次 |
| 最近记录: |