好的,这是我的问题:
- 我有一个
NSImageView
子类,用户可以将图像拖放到该子类上(又名dropper
) - 删除图像后,它的“已处理”版本将显示
NSImageView
在下一个它(又名output
)中
到目前为止非常简单。
问题是,每当我尝试调整窗口大小(显示处理后的图像后)时,应用程序崩溃(EXC_BAD_ACCESS
),控制台中没有显示任何内容(没有实际错误,即使NSZombieEnabled
设置为打开)。
如果我只是“复制”图像,则调整大小可以正常工作:
[_output setImage:[_dropper image]];
但是,当我将_output
图像设置为过滤后的版本时,问题就来了:
NSImage* processed = [[[_dropper image] copy] filteredWith:[CIFilter sepiaToneWithIntensity:0.5]];
[_output setImage:processed];
这里是上面提到的 2 个函数(实际上是我分别为CIImage
和编写的类别CIFilter
):
- (NSImage*)filteredWith:(CIFilter *)filter
{
NSImage* start = [self copy];
CIContext* context = [[CIContext alloc] init];
CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)[start TIFFRepresentation], NULL);
CGImageRef ref = CGImageSourceCreateImageAtIndex(src, 0, NULL);
CIImage* img = [CIImage imageWithCGImage:ref];
[filter setValue:img forKey:kCIInputImageKey];
CIImage* result = [filter valueForKey:kCIOutputImageKey];
CGImageRef res = [context createCGImage:result fromRect:[result extent]];
NSImage* final = [[NSImage alloc] initWithCGImage:res size:[start size]];
return final;
}
+ (CIFilter*)sepiaToneWithIntensity:(CGFloat)intensity
{
CIFilter* newFilter = [CIFilter filterWithName:@"CISepiaTone"];
[newFilter setValue:[NSNumber numberWithFloat:intensity] forKey:@"inputIntensity"];
return newFilter;
}
有任何想法吗?