Comment puis-je convertir FBProfilePictureView en UIImage?

Tout fonctionne très bien avec FBProfilePictureView mais j'ai besoin d'get cette image à partir de FBProfilePictureView et de le transformer en UIImage.

Comment dois-je le faire?

J'ai essayé d'utiliser ceci:

UIGraphicsBeginImageContext(self.profilePictureView.frame.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); self.TestPictureOutlet.image = viewImage; 

Mais cela ne marche pas pour ma solution.

FBProfilePictureView est un UIView, cet UIView contient un UIImageView, c'est-à-dire votre image, vous pouvez get le UIImage à partir de ce UIImageView:

profilePictureView est un FBProfilePictureView

 UIImage *image = nil; for (NSObject *obj in [profilePictureView subviews]) { if ([obj isMemberOfClass:[UIImageView class]]) { UIImageView *objImg = (UIImageView *)obj; image = objImg.image; break; } } 

EDIT: append une autre manière plus rapidement mais faire la même chose

 __block UIImage *image = nil; [self.view.subviews enumerateObjectsUsingBlock:^(NSObject *obj, NSUInteger idx, BOOL *stop) { if ([obj isMemberOfClass:[UIImageView class]]) { UIImageView *objImg = (UIImageView *)obj; image = objImg.image; *stop = YES; } }]; 

Les deux solutions mentionnées ci-dessus fonctionnent bien pour extraire l'object UIImage de FBProfilePictureView. La seule chose est, vous devez mettre un certain timeout avant d'get l'image de FBProfilePictureView. Comme:

 [FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { if (!error) { myNameLbl.text = user.name; profileDP.profileID = user.id; //NOTE THIS LINE WHICH DOES THE MAGIC [self performSelector:@selector(getUserImageFromFBView) withObject:nil afterDelay:1.0]; }]; - (void)getUserImageFromFBView{ UIImage *img = nil; //1 - Solution to get UIImage obj for (NSObject *obj in [profileDP subviews]) { if ([obj isMemberOfClass:[UIImageView class]]) { UIImageView *objImg = (UIImageView *)obj; img = objImg.image; break; } } //2 - Solution to get UIImage obj // UIGraphicsBeginImageContext(profileDP.frame.size); // [profileDP.layer renderInContext:UIGraphicsGetCurrentContext()]; // img = UIGraphicsGetImageFromCurrentImageContext(); // UIGraphicsEndImageContext(); //Here I'm setting image and it works 100% for me. testImgv.image = img; } 

Cordialement!

Aamir Ali – iOS Apps Développeur

@Time Group (TGD)

Voici la solution.

pas:

Assurez-vous que vous avez affecté l'ID user FB à l'object de class "FBProfilePictureView" dans mon cas, cet object de class est "userPictureImageView"

 -(void)saveFBUserImage { CGSize imageSize = self.userPictureImageView.frame.size; UIGraphicsBeginImageContext(imageSize); CGContextRef imageContext = UIGraphicsGetCurrentContext(); [self.userPictureImageView.layer renderInContext: imageContext]; UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData *imageData = UIImageJPEGRepresentation(viewImage,1); UIImage * img = [UIImage imageWithData:imageData]; NSSsortingng *filePath = <specify your path here>; CGSize size = img.size; if(size.height > 50) size.height = 50; if(size.width > 50) size.width = 50; CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); CGSize size2 = rect.size; UIGraphicsBeginImageContext(size2); [img drawInRect:rect]; img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData *newImageData = UIImageJPEGRepresentation(img, 1.0); [newImageData writeToFile:filePath atomically:YES]; } 

C'est tout. 🙂

J'ai trouvé ci-dessus des solutions pour être tout à fait fonctionnant mais voici le code mis à jour que je l'ai trouvé plus facile allant.

  @property FBSDKProfilePictureView *pictureView; if ([FBSDKAccessToken currentAccessToken]) { self.pictureView=[[FBSDKProfilePictureView alloc]init]; [self.pictureView setProfileID:@"me"]; [self.pictureView setPreservesSuperviewLayoutMargins:YES]; [self.pictureView setPictureMode:FBSDKProfilePictureModeNormal]; [self.pictureView setNeedsImageUpdate]; [self performSelector:@selector(getUserImageFromFBView) withObject:nil afterDelay:1.0]; } -(void) getUserImageFromFBView { UIImage *image = nil; for (NSObject *obj in [self.pictureView subviews]) { if ([obj isMemberOfClass:[UIImageView class]]) { UIImageView *objImg = (UIImageView *)obj; image = objImg.image; break; } } [self.profilePic setImage:image forState:UIControlStateNormal]; } 

J'espère que cela t'aides. Ici j'ai mis 1 seconde de retard pour attendre que l'image de profil soit chargée.