2017-02-06 1 views
2

J'essaye de redimensionner l'image JPEG en Objective-C (iOS). L'entrée est un fichier JPG et la sortie doit être UIImage.Objective-C (iOS), Redimensionnement d'image en utilisant CIFilter produit une sortie invalide (UIImage)

Je possède ce code:

// Load image from a file 
NSData *imageData = [NSData dataWithContentsOfFile:jpgFile]; 
UIImage *inputImage = [UIImage imageWithData:imageData]; 
CIImage *ciImage = inputImage.CIImage; 

// Set Lanczos filter 
CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; 
[scaleFilter setValue:ciImage forKey:@"inputImage"]; 
[scaleFilter setValue:[NSNumber numberWithFloat:0.5] forKey:@"inputScale"]; 
[scaleFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputAspectRatio"]; 

// Get an output 
CIImage *finalImage = [scaleFilter valueForKey:@"outputImage"]; 
UIImage *outputImage = [[UIImage alloc] initWithCIImage:finalImage]; 

Mais l'image de sortie est invalide (outputImage.size.height is 0), et il provoque des erreurs suivantes dans un autre traitement:

CGContextDrawImage: 0x0 contexte non valide. Si vous voulez voir le backtrace , veuillez définir la variable environnement CG_CONTEXT_SHOW_BACKTRACE . ImageIO: JPEG vide image JPEG (DNL non pris en charge)


Mise à jour:

Je ne sais pas, ce qui est mal avec le code ci-dessus (à l'exception de l'initialisation mentionnée par Sulthan ci-dessous - merci lui pour ça). Je le code suivant à la fin (ce code fonctionne OK):

CIImage *input_ciimage = [[CIImage alloc] initWithImage:inputImage]; 
CIImage *output_ciimage = 
    [[CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues: 
    kCIInputImageKey, input_ciimage, 
    kCIInputScaleKey, [NSNumber numberWithFloat:0.5], 
    nil] outputImage]; 
CIContext *context = [CIContext contextWithOptions:nil]; 
CGImageRef output_cgimage = [context createCGImage:output_ciimage fromRect:[output_ciimage extent]]; 
UIImage *output_uiimage = [UIImage imageWithCGImage:output_cgimage]; 
CGImageRelease(output_cgimage); 

Répondre

1

Cette ligne est le problème:

CIImage *ciImage = inputImage.CIImage 

Si l'image n'est pas initialisé à partir d'un CIImage alors il est propre CIImage est nil. Une approche plus sûre est:

CIImage *ciImage = [[CIImage alloc] initWithImage:inputImage]; 

Aussi, assurez-vous que l'image a été chargé avec succès à partir de vos données.

+0

Il a changé un peu. il traite une image (l'erreur est toujours là - sans la partie JPEG), mais l'image est noire ou remplie de bruit de couleur, outputImage.size.height les variables de largeur sont des nombres de non-sens (valeurs grandes ou négatives). Quelque chose d'autre qui peut être faux avec ça? – Jolinar

+0

@Jolinar Ma conjecture est que votre image originale n'est pas chargée correctement. Avez-vous vérifié la taille de 'inputImage'? – Sulthan

+0

Oui, l'image originale a un vrai WxH et est traitée correctement (il y a quelques corrections de couleur, et une exportation JPEG), si le redimensionnement n'est pas effectué. – Jolinar