应用CIFilter会破坏.BMP文件中的数据

时间:2011-08-17 16:34:19

标签: objective-c cocoa core-image

我似乎想把自己绑在一起试图阅读所有可以在OSX的Cocoa应用程序中表示图像的不同方法。

我的应用程序读入图像,将CIFilters应用于它,然后保存输出。直到今天早上,这对我投入的所有图像都很好。但是,我发现一些BMP文件在我尝试将任何CIFilter应用到它们时会产生空的透明图像。

一个这样的图像是Dragon Age 2加载器的广告之一(我今天早上只是在随机图像上测试我的应用程序); http://www.johnwordsworth.com/wp-content/uploads/2011/08/hires_en.bmp

具体来说,我的代码执行以下操作。

  1. 使用imageWithCGImage加载CIImage(initWithContentsOfURL也出现同样的问题)。
  2. 将多个CIFilter应用于CIImage,同时将当前图像存储在我的AIImage容器类中。
  3. 通过向NSImage添加NSCIImageRep来预览图像。
  4. 使用NSBitmapImageRep / initWithCIImage保存图像,然后使用representationUsingType保存图像。
  5. 此过程适用于我投入的99%的文件(目前为止所有JPG,PNG,TIFF),而不是某些BMP文件。如果我跳过第2步,预览和保存的图像就会出现。但是,如果我打开第2步,则生成的图像始终为空白且透明。

    代码非常大,但我认为这是相关的代码片段......

    AIImage加载方法

    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:imagePath], nil);    
    CGImageRef imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, nil);
    CFDictionaryRef dictionaryRef = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil);                
    
    self.imageProperties = [NSMutableDictionary dictionaryWithDictionary:((NSDictionary *)dictionaryRef)];
    self.imageData = [CIImage imageWithCGImage:imageRef];
    

    AIImageResize方法

    NSAffineTransform *transform = [NSAffineTransform transform];
    [transform scaleXBy:(targetSize.width / sourceRect.size.width) yBy:(targetSize.height / sourceRect.size.height)];
    
    CIFilter *transformFilter = [CIFilter filterWithName:@"CIAffineTransform"];
    [transformFilter setValue:transform forKey:@"inputTransform"];
    [transformFilter setValue:currentImage forKey:@"inputImage"];
    currentImage = [transformFilter valueForKey:@"outputImage"];
    
    aiImage.imageData = currentImage;
    

    CIImagePreview Method

    NSCIImageRep *imageRep = [[NSCIImageRep alloc] initWithCIImage:ciImage];
    NSImage *nsImage = [[[NSImage alloc] initWithSize:ciImage.extent.size] autorelease];
    [nsImage addRepresentation:imageRep];
    

    谢谢你的期待。任何建议都将不胜感激。

0 个答案:

没有答案