Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
.picasa.ini decoded
# .picasa.ini FILE STRUCTURE
# reverse-engineered by Franz Buchinger <>
# licensed to the public domain
# Picasa Version(s): 3.8.0
# Changelog:
# v0.1: initial release
# ==============================================================
# 1. Picasa Section
# The picasa section contains album-related metadata.
# Obviously, it is only present if the image folder was
# converted to a picasa album or if it was created during
# an import of images from a digital camera.
# the name of the album
name=Foo Bar birthday
# category: "Folders on Disk" for local albums
category=Folders on Disk
#if album was downloaded from picasa web albums, a key in this format
# is stored
P2category=Downloaded Albums~otheruserid
#if the album was uploaded, the username and album id are referenced in this format: <picasa user name>_lh=<picasa web album id>
# 2. Contacts Section
# the contacts section matches the recognized faces of
# persons to the contacts of the picasa user.
# format <person_id>=<picasa user name>_lh,<picasa contact id>
# TODO: what about not-yet confirmed or unidentified faces
# 3. Photo Entries
# each photo found in the current directory gets one ini section
# in the file, named after its filename. depending on the file
# type (jpeg vs camera raw), different metadata is stored in the
# section.
#added if image was starred in picasa
#caption entered in picasa
#(only added for non-jpeg photos, stored as IPTC Caption for jpeg photos)
#keywords assigned in picasa
#(only added for non-jpeg photos, stored as IPTC Keywords for jpeg photos)
keywords=beer,empanadas,keyword with spaces
#backuphash - not yet decoded
#if the pictures of the album have been uploaded
# a key/value pair in the format IIDLIST_<picasa user name>_lh=<64-bit hexadecimal photo id>
# is added to each photo entry.
# all applied filters per photo are recorded to .picasa.ini
# to provide an editing history and/or an easier undo facility.
# Basic filter key format:
# the filters key of each photo stores a semicolon-separated list of filter entries:
# each entry follows the format
# <filter identifier>=1,<filter value 1>,<filter value 2>,<..filter value n>;
# Here is a list of valid filter identifiers
#| crop64 | CROP_RECTANGLE* | crop filter, crops the image | crop64=1,30a730d2bf1ab897 |
#| | | according to crop rectangle | |
#| tilt | !TILT_ANGLE,!SCALE | tilts and scales image | tilt=1,0.280632,0.000000 |
#| redeye | | redeye removal | redeye=1 |
#| enhance | | "I'm feeling lucky" enhancement| enhance=1 |
#| autolight | | automatic contrast correction | autolight=1 |
#| autocolor | | automatic color correction | autocolor=1 |
#| retouch | | retouch | retouch=1 |
#| finetune2 | (unidentified params) | finetuning (brightness, | finetune2=1,0.000000,0.000000,|
#| | |highlights, shadows,color temp) | 0.000000,fff7f5f3,0.000000; |
#| unsharp2 | !AMOUNT | unsharp mask filter | unsharp2=1,0.600000; |
#| sepia | | sepia filter (no params) | sepia=1 |
#| bw | | black/white filter (no params) | bw=1 |
#| warm | | warming filter (no params) | bw=1 |
#| grain2 | | film grain filter (no params) | grain2=1 |
#| tint |!!PRESERVE_COLOR ,#TINT COLOR | tint filter | tint=1,79.842102,ffff |
#| sat |!SATURATION | saturation filter | sat=1,0.161800; |
#| radblur |!MOUSE_X,!MOUSE_Y,!SIZE,!AMOUNT | radial blur | radblur=1,0.500000,0.500000, |
#| | | | 0.239766,0.146199; |
#| glow2 |!INTENSITY,!!RADIUS | glow effect | glow2=1,0.650000,3.000000; |
#| ansel |#COLOR | filtered black/white | ansel=1,ffffffff; |
#| radsat |!MOUSE_X,!MOUSE_Y,!RADIUS,!SHARPNESS | radial saturation | radsat=1,0.421652,0.594697, |
#| | | | 0.333333,0.309942; |
#| dir_tint |!MOUSE_X,!MOUSE_Y,!GRADIENT,!SHADOW | directed gradient | dir_tint=1,0.306743,0.401515, |
#| | | | 0.250000,0.250000,ff5bfff3; |
# ! = float between 0 and 1, precision:6
# !! = float with arbitrary range, precision:6
# # = 32-bit color in hex notation, e.g.: fff7f5f3
# [] = crop rectangle
text=1;136;11;sample text;Aharoni;0.279301,0.503929,0.033333,0.000000;v1,4294967295,4278190080,128.000000,1.000000,0.364486,0.878906,700,258,49152;;
# all recognized faces are stored as bigint crop rectangles in the faces key
# format faces=rect64(CROP_RECTANGLE*), contact_id;
# Picasa uses a special string format to store crop boxes of
# detected faces and from an applied crop filters. The number encased
# in the rect64() statement is a 64 bit hexadecimal number:
# rect64(3f845bcb59418507)
# break this number into 4 16-bit numbers by using substrings:
# '3f845bcb59418507'.substring(0,4) //"3f84"
# '3f845bcb59418507'.substring(4,8) //"5bcb"
# '3f845bcb59418507'.substring(8,12) // "5941"
# '3f845bcb59418507'.substring(12,16) // "8507"
# convert each obtained substring to an integer and divide it
# by the highest 16-bit number (2^16 = 65536), which should give 0 < results < 1.
# these are the relative coordinates of the crop rectangle (left,top,right,bottom):
# parseInt("3f84",16)/65536 //0.24810791015625 - left
# parseInt("5bcb",16)/65536 //0.3585662841796875 - top
# parseInt("5941",16)/65536 //0.3486480712890625 - right
# parseInt("8507",16)/65536 //0.5196380615234375 - bottom
# for absolute coordinates, multiply the left/right coordinates with
# the image width and the top/bottom coordinates with the image height
# floats between 0 and 1 with a precision of 6 digits, e.g. 0.306743.
# Often used to encode relative settings or mouse positions.
# A.1.3 FLOATS (!!)
# arbitrary floats with a precision of 6 digits
# A.1.4. COLORS (#)
# colors are stored as 32-bit hex string, e.g. ff5bfff3

VijayS1 commented Mar 24, 2014

With picasa v3.9.137, we have an [.album:343asdf34asdf] section with

also the [img] sections,
have an albums tag, which a csv of album tokens.

Great job, @fbuchinger!

dolmen commented Aug 3, 2014

Missing entries seen in the wild for a picture:

  • category
  • flipped
  • rotate
  • height
  • width
  • moddate
  • redo
  • crop

Missing sections seen in the wild:

  • encoding

See also:

bremme commented Aug 27, 2014

A little addition on the "[Contacts]" section. I think if you are logged into your Google account you will indeed get the "[Contacts]" section in your picasa.ini files. But if you only use local contact, you will get a "[Contacts2]" section which looks like this:

b8e4117cf1d6615b=Roy Avery;;
47d06f0716518784=Kenyatta Folkers;;
7913c869eff350e5=Beatris Riveria;;

Other than that, the actual reference to the face tag rectangle is the same, e.g.


By doing so, I think, you don't even need a contacts.xml file to properly import the face tags since all the required information is already in the picasa.ini file(s) (If you write your tags to xmp, which I would suggest, importing will always work properly anyway)

bremme commented Aug 27, 2014

Another addition on your contact TODO, when a face is recognized but "not yet confirmed" (the rectangle around the face is known and a name is suggested). You will see: ffffffffffffffff as the <contact_id> like this:


When a face is detected but there is not suggestion ( unidentified faces), nothing will show up in the picasa.ini file.

felciano commented Dec 6, 2014

This is great -- thanks for putting it together! I'm trying to reconstruct a set of Picasa albums that were overwritten. I've restored the .picasa.ini files from a backup but the albums still aren't refreshing correctly in the UI. Is there a way to force that to happen, or to otherwise force Picasa to update itself from the these .picasa.ini files?

jneander commented Aug 8, 2015

Has anyone determined the significance of moddate?

Regarding the [Contacts] and [Contacts2] sections... I wrote a Lightroom plugin for migrating from Picasa to lightroom which converts all picasa data from the ini files and imports into to Lightroom ( It represents each "contact" as a lightroom collection. It failed for one user who had been using Picasa for many years and many versions. Her picasa.ini file had both a [Contacts] and [Contacts2] section. The [Contacts2] section did not follow the format above. It seemed to be the same format of the old [Contacts] section but with a different hash ID after the comma.

Here are the exact sections, except I changed the real google user name to "gusername":




  • Does anyone know the rules behind the above migration from Contacts to Contacts2?
  • Whats the difference between the comma and semicolon separators?
  • It seems like at some version of Picasa, they switched from Contacts to Contacts2. If the old Contacts section is present, is it used at all? or is all the information transferred to Contacts2?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment