How to get large photo URL in one API call?

50,803

Solution 1

I haven't tried this with stream/feed photos, but the generally accepted way of doing this is:

http://graph.facebook.com/{ID of object}/picture

If you want the "large" version, you would do:

http://graph.facebook.com/{ID of object}/picture?type=large

I'm not 100% sure if this would work for an actual photo (instead of a user profile picture or page profile pic), but I have a hunch it will - the only caveat is that you obviously must have a logged in user that is authorized to view the photo (unless it's public).

Solution 2

If anybody is looking to this and type large is not enough, I found other solutions.

Type large is kind of small anyway (close to 200px). You can get larger image by adding i.e. ?width=1000 or ?height=1000. Facebook will return picture closest to given dimension and preserve aspect ratio. When passing both dimenstions like ?width=1000&height=1000, facebook will cut image to given dimensions (in this case square).

Solution 3

Use Facebook UserId (Oject ID) to get the picture.

https://graph.facebook.com/173xxxx8635/picture?type=large&redirect=false

which returns JSON data with picture URL.

{
   "data": {
      "is_silhouette": false,
      "url": "https://fbcdn-profile-a.akamaihd.net/xxx/xyz/1cc066a2cae3f301d"
   }
}

Solution 4

A good trick with the new api is to get the pic_cover field from the event table and to process it according to the size you want to use

Solution 5

I found when I was having this trouble that it turned out to be the picture I was downloading rather than the size I was setting it.

If for example I downloaded all my photos with a request of

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,picture&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"picture"] 
    }
}];

I am using the dictionary key search "picture" as I want the picture.

This though will get me a lower quality picture than if I searched for "source" in this search:

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,source&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"source"] 
    }
}];

If you go on the Facebook API explorer and search for photos and then click on the picture and source jpg links you can see the difference in size and quality.

Since changing this method I have managed to get rid of using the type parameters as it doesn't seem to make a different.

Note: I am using iPhone and not iPad or a larger screen so I don't know how this affects bigger screens.

Share:
50,803
John Wright
Author by

John Wright

I love trail running a lot and some of my best ideas and motivation for programming come after a good run in the mountains. I am learning Ruby, Python, Erlang, and Objective C. I know Javascript and Java pretty well. I love the Rails and JQuery frameworks especially. Stack Overflow is awesome and I hope to give back to other programmers and learn a ton from this site.

Updated on July 10, 2020

Comments

  • John Wright
    John Wright almost 4 years

    I want to display large photos in my Facebook app's feed view immediately. Is it possible to get the large photo src URL from a stream/feed using one API call? The photo id is returned in the stream/feed and one can of course then supply this photo id in an additional FQL or graph API call to retrieve all the information about that photo. However, is there a way using multi-query or batch calls to get a larger photo src url using one API roundtrip?