0

好的,这是我的问题:

  • 我有一个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;
}

有任何想法吗?

4

0 回答 0