réglage du mode de contenu UIImageView après l'application d'un CIFIlter

Merci d'avoir regardé.

Voici mon code

CIImage *result = _vignette.outputImage; self.mainImageView.image = nil; //self.mainImageView.contentMode = UIViewContentModeScaleAspectFit; self.mainImageView.image = [UIImage imageWithCIImage:result]; self.mainImageView.contentMode = UIViewContentModeScaleAspectFit; 

ici _vignette est correctement configuré filter et l'effet de l'image s'applique à l'image correctement.

J'utilise une image source avec une résolution de 500×375. Mon imageView a presque la résolution de l'écran de l'iPhone. Donc, pour éviter les étirements, j'utilise AspectFit.

Mais après l'application de l'effet lorsque j'affecte l'image du résultat à mon image, elle s'étire. Peu importe quel UIViewContentMode j'utilise. Ça ne marche pas. Il semble qu'il applique toujours ScaleToFill quel que soit le filter que j'ai donné.

Une idée pourquoi cela se passe-t-il? Les suggestions sont grandement appréciées.

(1) Ajuster l'image étire l'image – pour s'adapter. Si vous ne voulez pas que l'image soit étirée, utilisez Center (par exemple).

(2) imageWithCIImage vous donne une bête très étrange, un UIImage non basé sur CGImage, et donc pas sensible aux règles normales de l'affichage des calques. Ce n'est vraiment rien d'autre qu'une mince enveloppe autour de CIImage, ce qui n'est pas ce que vous voulez. Vous devez convertir (rendre) la sortie CIFilter à travers CGImage en UIImage, vous donnant ainsi un UIImage qui a en fait quelques bits (CGImage, un bitmap). Ma discussion ici vous donne le code qui démontre:

http://www.apeth.com/iOSBook/ch15.html#_cifilter_and_ciimage

En d'autres termes, vous devez à un moment donné appeler CIContext createCGImage:fromRect: pour générer un CGImageRef à partir de la sortie de votre CIFilter, et le transmettre dans un UIImage. Jusqu'à ce que vous le fassiez, vous n'avez pas la sortie de vos opérations de filtrage en tant que véritable UIImage.

Vous pouvez également dessiner l'image à partir de imageWithCIImage dans un context graphique. Par exemple, vous pouvez le dessiner dans un context de graphique image et ensuite utiliser cette image.

Ce que vous ne pouvez pas faire est d'afficher directement l'image de imageWithCIImage . C'est parce que ce n'est pas une image! Il n'a pas de bitmap sous-jacent (CGImage). Il n'y a pas là-bas. Tout ce qu'il est est un set d'instructions CIFilter pour dériver l'image.

Je viens de passer toute la journée là-dessus. Je recevais des problèmes d'orientation suivis d'une mauvaise qualité de sortie.

Après avoir pris une photo avec l'appareil photo, je fais ça.

 NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; UIImage *image = [[UIImage alloc] initWithData:imageData]; 

Cela provoque un problème de rotation, donc je devais le faire.

 UIImage *scaleAndRotateImage(UIImage *image) { int kMaxResolution = image.size.height; // Or whatever CGImageRef imgRef = image.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); if (width > kMaxResolution || height > kMaxResolution) { CGFloat ratio = width/height; if (ratio > 1) { bounds.size.width = kMaxResolution; bounds.size.height = bounds.size.width / ratio; } else { bounds.size.height = kMaxResolution; bounds.size.width = bounds.size.height * ratio; } } CGFloat scaleRatio = bounds.size.width / width; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = image.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; } 

Ensuite, quand j'applique mon filter, je le fais (avec des remerciements spéciaux à ce fil – spécifiquement mat et Wex)

  -(UIImage*)processImage:(UIImage*)image { CIImage *inImage = [CIImage imageWithCGImage:image.CGImage]; CIFilter *filter = [CIFilter filterWithName:@"CIColorControls" keysAndValues: kCIInputImageKey, inImage, @"inputContrast", [NSNumber numberWithFloat:1.0], nil]; UIImage *outImage = [filter outputImage]; //Juicy bit CGImageRef cgimageref = [[CIContext contextWithOptions:nil] createCGImage:outImage fromRect:[outImage extent]]; return [UIImage imageWithCGImage:cgimageref]; }