Obtention de NSData à partir d'un object UIImage contenant CGImage

Afin de download un file image sur mon server, j'ai besoin de l'get. J'ai du mal à faire ça maintenant, parce que mon UIImage contient un CGImage.

Laissez-moi vous montrer comment je fais les choses. Quand un user prend une photo, c'est ce que je fais avec la photo capturée:

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; UIImage *image = [[UIImage alloc]initWithData:imageData]; _subLayer = [CALayer layer]; image = [self selfieCorrection:image]; image = [self rotate:image andOrientation:image.imageOrientation]; CGRect cropRectFinal = CGRectMake(cropRect.origin.x, 140, cropRect.size.width, cropRect.size.height); CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRectFinal); _subLayer.contents = (id)[UIImage imageWithCGImage:imageRef].CGImage; 

Dans le code ci-dessus, je crée un UIImage et l'initialise avec l'object imageData . Je crée également un object layer appelé _subLayer qui affichera l'image finale sur l'écran. L'orientation de l'image est ensuite pivotée et corrigée, puis je configure un CGRect pour recadrer la partie de l'image que je veux conserver.

La partie la plus importante sont les 2 dernières déclarations. Je crée un CGImageRef appelé imageRef utilisant l'UIImage d'origine. Ensuite, dans la dernière instruction, j'ai défini la propriété contents de _subLayer pour qu'elle soit égale à mon image finale.

Un peu plus bas dans ce même controller de vue, à l'intérieur d'un IBAction j'ai la déclaration suivante qui m'aide à passer l'image à mon controller de vue suivant: sendFriendsVC.finalPhotoToSend = _subLayer.contents;

finalPhotoToSend est une propriété que j'ai configurée dans le file d'en-tête de mon controller suivant, comme ceci:

 @property (nonatomic, retain) UIImage *finalPhotoToSend; 

Les données sont passées avec succès quand je passe au controller de vue suivant, mais quand je NSLog finalPhotoToSend , même si c'est un UIImage, il imprime comme ceci à la console:

 <CGImage 0x1563dac0> 

Pour download des photos sur mon server principal, il faut que je crée un object en utilisant NSData. J'ai essayé d'utiliser ces 2 methods pour extraire le NSData de l'object finalPhotoToSend :

 NSData *imageData = UIImageJPEGRepresentation(finalPhotoToSend, 0.7); 

et

 NSData *imageData = UIImagePNGRepresentation(finalPhotoToSend); 

Mais ceux-ci me donnent toujours l'erreur suivante dans xcode:

 NSInvalidArgumentException', reason: '-[__NSCFType CGImage]: unrecognized selector sent to instance 

Je ne suis pas sûr de ce qu'il faut faire. Existe-t-il une méthode différente que je devrais utiliser pour get NSData de mon UIImage puisqu'il tient techniquement un CGImage? Devrais-je faire quelque chose différemment avant même de transmettre datatables à mon controller de vue suivant?

Edit pour Michael:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:self { if ([segue.identifier isEqualToSsortingng:@"mediaCaptureToSendToFriendsSegue"]) { SendToFriendsViewController *sendFriendsVC = segue.destinationViewController; sendFriendsVC.finalPhotoToSend = _subLayer.contents; } } 

Mieux répondre:

Vous devez vraiment définir un object UIImage (et non un pointeur CGImage) sur une propriété que vous avez déclarée être un object UIImage.

Original:

Si " finalPhotoToSend " est une propriété, vous devriez faire:

 NSData *imageData = UIImageJPEGRepresentation(self.finalPhotoToSend, 0.7); 

et pas:

 NSData *imageData = UIImageJPEGRepresentation(finalPhotoToSend, 0.7); 

Je l'ai juste compris. Voici ce que j'ai fini par utiliser pour la mise en œuvre de la méthode IBAction:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:self { if ([segue.identifier isEqualToSsortingng:@"mediaCaptureToSendToFriendsSegue"]) { SendToFriendsViewController *sendFriendsVC = segue.destinationViewController; UIImage* image2 = [UIImage imageWithCGImage:(__bridge CGImageRef)(_subLayer.contents)]; sendFriendsVC.finalPhotoToSend = image2; } } 

Je suis nouveau à l'objective-c et pas vraiment tout à fait sûr de ce que la déclaration suivante est en train de faire:

 UIImage* image2 = [UIImage imageWithCGImage:(__bridge CGImageRef)(_subLayer.contents)]; 

Mais xcode l'a suggéré et cela fonctionne. Maintenant sur le controller de vue suivant, l'object finalPhotoToSend NSLogs comme UIImage au lieu d'un CGImage.