如何将FBProfilePictureView转换为UIImage?

16

使用FBProfilePictureView一切正常,但我需要从FBProfilePictureView获取该图片并将其转换为UIImage。

我应该如何做?

我尝试了使用以下代码:

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

但是这对我的解决方案无效。


不确定为什么他们没有暴露UIImage。解决方案很糟糕,但是你能否只使用Graph API并通过URL加载? - Ben Flynn
4个回答

17

FBProfilePictureView是一个UIView,它包含一个UIImageView,该UIImageView显示您的图像,您可以从该UIImageView获取UIImage:

profilePictureView是一个FBProfilePictureView

UIImage *image = nil;

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

编辑:添加另一种更快的方法,但实现相同的功能

__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;
    }
}];

1
如果图片还没有下载,返回nil。您需要设置延迟或在图片下载时加载UIImage,否则返回nil。但是,这段代码可以正常工作。 - busta117
@busta117:我最初尝试了你的回答但没有起作用,后来我通过延迟下载使其工作了。谢谢。 - Mak13

3
上述两种解决方案都可以正常从FBProfilePictureView中获取UIImage对象。 唯一需要注意的是,在从FBProfilePictureView中获取图像之前需要添加一些延迟。 例如:
[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;

}

问候!

Aamir Ali - iOS 应用程序开发者

@Time Group (TGD)


0
我发现上述解决方案相当有效,但这里是我发现更加简单易懂的更新代码。
 @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];
}

希望这可以帮到你。在这里,我设置了1秒的延迟等待个人资料图片加载完成。

0

这里是解决方案。

步骤:

确保将FB用户ID分配给类对象“FBProfilePictureView”,在我的情况下,该类对象为“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]; 

    NSString *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];
}

就这样了。:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接