开发者

Applying CIFilter destroys data from .BMP File

I seem to be tying myself up in knots trying to read into all of the different ways you can represent images in a Cocoa app for OSX.

My app reads in an image, applies CIFilters to it and then saves the output. Until this morning, this worked fine for all of the images that I've thrown at it. However, I've found some BMP files that produce empty, transparent images as soon as I try to apply any CIFilter to them.

One such image is one of the adverts from the Dragon Age 2 loader (I was just testing my app on random images this morning); http://www.johnwordsworth.com/wp-content/uploads/2011/08/hires_en.bmp

Specifically, my code does the following.

  1. Load a CIImage using imageWithCGImage (the same problem occurs with initWithContentsOfURL).
  2. Apply a number of CIFilters to the CIImage, all the while storing the current image in my AIImage container class.
  3. Previews the image by adding an NSCIImageRep to an NSImage.
  4. Saves the image using NSBitmapImageRep / initWithCIImage and then representationUsingType.

This process works with 99% of the files I've thrown at it (all JPGs, PNGs, TIFFs so far), just not with certain BMP files. If I skip step 2, the preview and saved imag开发者_如何学运维e come out OK. However, if I turn step 2 on, the image produced is always blank and transparent.

The code is quite large, but here are what I believe to be the relevant snippets...

AIImage Loading Method

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 Method

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];

Thanks for looking. Any advice would be greatly appreciated.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜