2012-08-09 74 views
16

一切正常FBProfilePictureView工作正常,但我需要从FBProfilePictureView获取该图片,并将其变成UIImage。如何将FBProfilePictureView转换为UIImage?

我应该怎么做?

我尝试使用这样的:

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

但对于我的解决方案,这并不工作。

+0

不知道他们为什么没有公开UIImage。 Lame解决方案,但是你可以使用Graph API并通过URL加载吗? – 2012-08-29 02:54:31

回答

17

FBProfilePictureView是一个UIView,这UIView的包含一个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; 
    } 
}]; 
+2

这返回无 – 2013-01-19 00:12:26

+2

是...返回无。这是为任何人工作? – Dev 2013-01-24 10:06:22

+1

如果图片还没有下载,请返回nil,您需要设置延时或下载图片时载入UIImage,否则返回nil,但此代码有效 – busta117 2013-02-07 13:32:27

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

这它。 :-)

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; 

} 

问候!

阿米尔·阿里 - iOS应用开发者

@time集团(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秒的延迟,等待加载配置文件图片。