Home | History | Annotate | Download | only in examples
      1 /*
      2  * libexif example program to display the contents of a number of specific
      3  * EXIF and MakerNote tags. The tags selected are those that may aid in
      4  * identification of the photographer who took the image.
      5  *
      6  * Placed into the public domain by Dan Fandrich
      7  */
      8 
      9 #include <stdio.h>
     10 #include <string.h>
     11 #include <libexif/exif-data.h>
     12 
     13 /* Remove spaces on the right of the string */
     14 static void trim_spaces(char *buf)
     15 {
     16     char *s = buf-1;
     17     for (; *buf; ++buf) {
     18         if (*buf != ' ')
     19             s = buf;
     20     }
     21     *++s = 0; /* nul terminate the string on the first of the final spaces */
     22 }
     23 
     24 /* Show the tag name and contents if the tag exists */
     25 static void show_tag(ExifData *d, ExifIfd ifd, ExifTag tag)
     26 {
     27     /* See if this tag exists */
     28     ExifEntry *entry = exif_content_get_entry(d->ifd[ifd],tag);
     29     if (entry) {
     30         char buf[1024];
     31 
     32         /* Get the contents of the tag in human-readable form */
     33         exif_entry_get_value(entry, buf, sizeof(buf));
     34 
     35         /* Don't bother printing it if it's entirely blank */
     36         trim_spaces(buf);
     37         if (*buf) {
     38             printf("%s: %s\n", exif_tag_get_name_in_ifd(tag,ifd), buf);
     39         }
     40     }
     41 }
     42 
     43 /* Show the given MakerNote tag if it exists */
     44 static void show_mnote_tag(ExifData *d, unsigned tag)
     45 {
     46     ExifMnoteData *mn = exif_data_get_mnote_data(d);
     47     if (mn) {
     48         int num = exif_mnote_data_count(mn);
     49         int i;
     50 
     51         /* Loop through all MakerNote tags, searching for the desired one */
     52         for (i=0; i < num; ++i) {
     53             char buf[1024];
     54             if (exif_mnote_data_get_id(mn, i) == tag) {
     55                 if (exif_mnote_data_get_value(mn, i, buf, sizeof(buf))) {
     56                     /* Don't bother printing it if it's entirely blank */
     57                     trim_spaces(buf);
     58                     if (*buf) {
     59                         printf("%s: %s\n", exif_mnote_data_get_title(mn, i),
     60                             buf);
     61                     }
     62                 }
     63             }
     64         }
     65     }
     66 }
     67 
     68 int main(int argc, char **argv)
     69 {
     70     ExifData *ed;
     71     ExifEntry *entry;
     72 
     73     if (argc < 2) {
     74         printf("Usage: %s image.jpg\n", argv[0]);
     75         printf("Displays tags potentially relating to ownership "
     76                 "of the image.\n");
     77         return 1;
     78     }
     79 
     80     /* Load an ExifData object from an EXIF file */
     81     ed = exif_data_new_from_file(argv[1]);
     82     if (!ed) {
     83         printf("File not readable or no EXIF data in file %s\n", argv[1]);
     84         return 2;
     85     }
     86 
     87     /* Show all the tags that might contain information about the
     88      * photographer
     89      */
     90     show_tag(ed, EXIF_IFD_0, EXIF_TAG_ARTIST);
     91     show_tag(ed, EXIF_IFD_0, EXIF_TAG_XP_AUTHOR);
     92     show_tag(ed, EXIF_IFD_0, EXIF_TAG_COPYRIGHT);
     93 
     94     /* These are much less likely to be useful */
     95     show_tag(ed, EXIF_IFD_EXIF, EXIF_TAG_USER_COMMENT);
     96     show_tag(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION);
     97     show_tag(ed, EXIF_IFD_1, EXIF_TAG_IMAGE_DESCRIPTION);
     98 
     99     /* A couple of MakerNote tags can contain useful data.  Read the
    100      * manufacturer tag to see if this image could have one of the recognized
    101      * MakerNote tags.
    102      */
    103     entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MAKE);
    104     if (entry) {
    105         char buf[64];
    106 
    107         /* Get the contents of the manufacturer tag as a string */
    108         if (exif_entry_get_value(entry, buf, sizeof(buf))) {
    109             trim_spaces(buf);
    110 
    111             if (!strcmp(buf, "Canon")) {
    112                 show_mnote_tag(ed, 9); /* MNOTE_CANON_TAG_OWNER */
    113 
    114             } else if (!strcmp(buf, "Asahi Optical Co.,Ltd.") ||
    115                        !strcmp(buf, "PENTAX Corporation")) {
    116                 show_mnote_tag(ed, 0x23); /* MNOTE_PENTAX2_TAG_HOMETOWN_CITY */
    117             }
    118         }
    119     }
    120 
    121     /* Free the EXIF data */
    122     exif_data_unref(ed);
    123 
    124     return 0;
    125 }
    126