OK、ここに私の問題があります:
NSImageView
ユーザーが画像をドラッグアンドドロップできるサブクラスがあります(別名dropper
)- 画像がドロップされると、その「処理済み」バージョンが
NSImageView
次の it (akaoutput
)に表示されます。
これまでのところかなり簡単です。
ウィンドウのサイズを変更しようとすると (処理された画像を表示した後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;
}
何か案は?