Colores invertidos al crear UIImage desde CIImage (iOS 6.0)

He estado probando un montón de diferentes opciones y trucos para get un UIImage para build correctamente desde un CIImage. Pero, cada vez que creo el CIImage, sus colors parecen invertirse.

El código más reciente que tengo es:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"C4Sky" withExtension:@"png"]; CIImage *c = [CIImage imageWithContentsOfURL:url]; UIImage *i = [UIImage imageWithCIImage:c]; UIImageView *uiiv = [[UIImageView alloc] initWithImage:i]; [self.canvas addSubview:uiiv]; 

Cuál produce la siguiente image:

La imagen en color invertida.

Sin embargo, la construcción de una image como esta:

 UIImage *i = [UIImage imageNamed:@"C4Sky"]; UIImageView *uiiv = [[UIImageView alloc] initWithImage:i]; [self.canvas addSubview:uiiv]; 

… produce la siguiente image:

introduzca la descripción de la imagen aquí

He intentado muchas forms diferentes de build el CIImage.

  • https://stackoverflow.com/a/7788510/1218605
  • http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5
  • [CIImage imageWithData: UIImagePNGRepresentation (img)];
  • casi todos los demás constructores CIImage …

¿Esto está sucediendo porque el formatting de píxel en iOS para un CIImage es ARGB? (Parece que este es el único formatting posible en iOS6 en este momento)

  • CIImage Pixel Formats (iOS)

Si es así, ¿cómo puedo cambiar los formattings de píxeles para que este CIImage se vea normal?



He creado un repository de proyecto en git que muestra todas las principales forms diferentes que he probado (sin include variaciones de cada una). Hay 6 methods, los primeros 5 fallan:

https://github.com/C4Code/CIImageTest

El último método funciona, pero está realmente sucio:

 -(void)test6 { UIImage *img = [UIImage imageNamed:@"C4Sky"]; CGContextRef bitmapContext = NULL; void * bitmapData; int bitmapByteCount; int bitmapBytesPerRow; CGSize size = img.size; bitmapBytesPerRow = (size.width * 4); bitmapByteCount = (bitmapBytesPerRow * size.height); bitmapData = malloc( bitmapByteCount ); bitmapContext = CGBitmapContextCreate(bitmapData, size.width, size.height,8,bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(),kCGImageAlphaPremultipliedFirst); CGContextDrawImage(bitmapContext, (CGRect){CGPointZero,size}, img.CGImage); CGImageRef imgRef = CGBitmapContextCreateImage(bitmapContext); CIImage *cii = [CIImage imageWithCGImage:imgRef]; UIImage *finalImage = [UIImage imageWithCIImage:cii]; UIImageView *uiiv = [[UIImageView alloc] initWithImage:finalImage]; [self.canvas addSubview:uiiv]; //works but it's dirrrrrrrty } 

Estoy dibujando desde un UIImage en mi propio context de charts, y como esto funciona, me hace creer que podría haber un error con la implementación nativa de CIImage. Es decir, crear un CIImage de un UIImage no funciona … Una vez más, lo único que puedo pensar es que el CIImage está en el espacio ARGB, y el UIImage no es … Pero, no lo sé ¿Cómo evitar esto?

¿Es esto un error?

Algunas variantes adicionales para probar:

 //Grab the CIImage directly from the UIImage UIImage *img = [UIImage imageNamed:@"C4Sky.png"]; CIImage *c = img.CIImage; UIImage *i = [UIImage imageWithCIImage:c]; UIImageView *uiiv = [[UIImageView alloc] initWithImage:i]; [self.canvas addSubview:uiiv]; 

O

 //Maybe you need to set your own color space? UIImage *img = [UIImage imageNamed:@"C4Sky.png"]; CIImage *c = [CIImage imageWithCGImage:img.CGImage options:@{kCIImageColorSpace: kCGColorSpaceModelRGB}]; UIImage *i = [UIImage imageWithCIImage:c]; UIImageView *uiiv = [[UIImageView alloc] initWithImage:i]; [self.canvas addSubview:uiiv]; 

-jt

Esto también me mordió antes. Convierto UIImage s de CIImage s con algo como esto:

 - (UIImage *)newUIImageFromCIImage:(CIImage *)image { CGImageRef newImageRef = [[CIContext contextWithOptions:nil] createCGImage:image fromRect:[image extent]]; // you can cache CIContext as it's a little slow to create UIImage *newImage = [[UIImage alloc] initWithCGImage:newImageRef]; CGImageRelease(newImageRef); return newImage; } 

Algunas discusiones aquí .

Eche un vistazo a este tutorial. Tienes que aplicar filters antes de que se vea bien. ¡Espero que esto ayude!

rachel 🙂

por ejemplo (solo en caso de rupturas de enlaces)

 CIImage *beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath]; CIContext *context = [CIContext contextWithOptions:nil]; CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" keysAndValues: kCIInputImageKey, beginImage, @"inputIntensity", @0.8, nil]; CIImage *outputImage = [filter outputImage]; CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *newImage = [UIImage imageWithCGImage:cgimg]; self.imageView.image = newImage; CGImageRelease(cgimg);