diff --git a/libgimp/gimpimagemetadata.c b/libgimp/gimpimagemetadata.c index 5542c922c2..37847a7104 100644 --- a/libgimp/gimpimagemetadata.c +++ b/libgimp/gimpimagemetadata.c @@ -37,9 +37,10 @@ typedef struct gint type; } XmpStructs; +static gchar * gimp_image_metadata_interpret_comment (gchar *comment); -static void gimp_image_metadata_rotate (GimpImage *image, - GExiv2Orientation orientation); +static void gimp_image_metadata_rotate (GimpImage *image, + GExiv2Orientation orientation); /* public functions */ @@ -80,6 +81,37 @@ gimp_image_metadata_load_prepare (GimpImage *image, return metadata; } +static gchar * +gimp_image_metadata_interpret_comment (gchar *comment) +{ + /* Exiv2 can return unwanted text at the start of a comment + * taken from Exif.Photo.UserComment since 0.27.3. + * Let's remove that part and return NULL if there + * is nothing else left as comment. */ + + if (comment && g_str_has_prefix (comment, "charset=Ascii ")) + { + gchar *real_comment; + + /* Skip "charset=Ascii " (length 14) to find the real comment */ + real_comment = comment + 14; + if (real_comment[0] == '\0' || + ! g_strcmp0 (real_comment, "binary comment")) + { + g_free (comment); + return NULL; + } + else + { + real_comment = g_strdup (real_comment); + g_free (comment); + return real_comment; + } + } + + return comment; +} + /** * gimp_image_metadata_load_finish: * @image: The image @@ -109,6 +141,8 @@ gimp_image_metadata_load_finish (GimpImage *image, comment = gexiv2_metadata_get_tag_interpreted_string (GEXIV2_METADATA (metadata), "Exif.Photo.UserComment"); + comment = gimp_image_metadata_interpret_comment (comment); + if (! comment) comment = gexiv2_metadata_get_tag_interpreted_string (GEXIV2_METADATA (metadata), "Exif.Image.ImageDescription");