0

OK、ここに私の問題があります:

  • NSImageViewユーザーが画像をドラッグアンドドロップできるサブクラスがあります(別名dropper
  • 画像がドロップされると、その「処理済み」バージョンがNSImageView次の it (aka output)に表示されます。

これまでのところかなり簡単です。

ウィンドウのサイズを変更しようとすると (処理された画像を表示したEXC_BAD_ACCESS)、アプリがクラッシュし ( )、コンソールに何も表示されません (オンに設定されていても、実際のエラーはありませんNSZombieEnabled)。


画像を「コピー」するだけで、サイズ変更は正常に機能します。

[_output setImage:[_dropper image]];

ただし、_outputの画像をフィルター処理されたバージョンに設定すると、問題が発生します。

NSImage* processed = [[[_dropper image] copy] filteredWith:[CIFilter sepiaToneWithIntensity:0.5]];

[_output setImage:processed];

そして、ここに上記の2つの関数があります(実際には、私が書いたカテゴリCIImageCIFilterそれぞれ):

- (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