You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.7 KiB
126 lines
3.7 KiB
/*
|
|
* libexif example program to display the contents of a number of specific
|
|
* EXIF and MakerNote tags. The tags selected are those that may aid in
|
|
* identification of the photographer who took the image.
|
|
*
|
|
* Placed into the public domain by Dan Fandrich
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <libexif/exif-data.h>
|
|
|
|
/* Remove spaces on the right of the string */
|
|
static void trim_spaces(char *buf)
|
|
{
|
|
char *s = buf-1;
|
|
for (; *buf; ++buf) {
|
|
if (*buf != ' ')
|
|
s = buf;
|
|
}
|
|
*++s = 0; /* nul terminate the string on the first of the final spaces */
|
|
}
|
|
|
|
/* Show the tag name and contents if the tag exists */
|
|
static void show_tag(ExifData *d, ExifIfd ifd, ExifTag tag)
|
|
{
|
|
/* See if this tag exists */
|
|
ExifEntry *entry = exif_content_get_entry(d->ifd[ifd],tag);
|
|
if (entry) {
|
|
char buf[1024];
|
|
|
|
/* Get the contents of the tag in human-readable form */
|
|
exif_entry_get_value(entry, buf, sizeof(buf));
|
|
|
|
/* Don't bother printing it if it's entirely blank */
|
|
trim_spaces(buf);
|
|
if (*buf) {
|
|
printf("%s: %s\n", exif_tag_get_name_in_ifd(tag,ifd), buf);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Show the given MakerNote tag if it exists */
|
|
static void show_mnote_tag(ExifData *d, unsigned tag)
|
|
{
|
|
ExifMnoteData *mn = exif_data_get_mnote_data(d);
|
|
if (mn) {
|
|
int num = exif_mnote_data_count(mn);
|
|
int i;
|
|
|
|
/* Loop through all MakerNote tags, searching for the desired one */
|
|
for (i=0; i < num; ++i) {
|
|
char buf[1024];
|
|
if (exif_mnote_data_get_id(mn, i) == tag) {
|
|
if (exif_mnote_data_get_value(mn, i, buf, sizeof(buf))) {
|
|
/* Don't bother printing it if it's entirely blank */
|
|
trim_spaces(buf);
|
|
if (*buf) {
|
|
printf("%s: %s\n", exif_mnote_data_get_title(mn, i),
|
|
buf);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
ExifData *ed;
|
|
ExifEntry *entry;
|
|
|
|
if (argc < 2) {
|
|
printf("Usage: %s image.jpg\n", argv[0]);
|
|
printf("Displays tags potentially relating to ownership "
|
|
"of the image.\n");
|
|
return 1;
|
|
}
|
|
|
|
/* Load an ExifData object from an EXIF file */
|
|
ed = exif_data_new_from_file(argv[1]);
|
|
if (!ed) {
|
|
printf("File not readable or no EXIF data in file %s\n", argv[1]);
|
|
return 2;
|
|
}
|
|
|
|
/* Show all the tags that might contain information about the
|
|
* photographer
|
|
*/
|
|
show_tag(ed, EXIF_IFD_0, EXIF_TAG_ARTIST);
|
|
show_tag(ed, EXIF_IFD_0, EXIF_TAG_XP_AUTHOR);
|
|
show_tag(ed, EXIF_IFD_0, EXIF_TAG_COPYRIGHT);
|
|
|
|
/* These are much less likely to be useful */
|
|
show_tag(ed, EXIF_IFD_EXIF, EXIF_TAG_USER_COMMENT);
|
|
show_tag(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION);
|
|
show_tag(ed, EXIF_IFD_1, EXIF_TAG_IMAGE_DESCRIPTION);
|
|
|
|
/* A couple of MakerNote tags can contain useful data. Read the
|
|
* manufacturer tag to see if this image could have one of the recognized
|
|
* MakerNote tags.
|
|
*/
|
|
entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MAKE);
|
|
if (entry) {
|
|
char buf[64];
|
|
|
|
/* Get the contents of the manufacturer tag as a string */
|
|
if (exif_entry_get_value(entry, buf, sizeof(buf))) {
|
|
trim_spaces(buf);
|
|
|
|
if (!strcmp(buf, "Canon")) {
|
|
show_mnote_tag(ed, 9); /* MNOTE_CANON_TAG_OWNER */
|
|
|
|
} else if (!strcmp(buf, "Asahi Optical Co.,Ltd.") ||
|
|
!strcmp(buf, "PENTAX Corporation")) {
|
|
show_mnote_tag(ed, 0x23); /* MNOTE_PENTAX2_TAG_HOMETOWN_CITY */
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Free the EXIF data */
|
|
exif_data_unref(ed);
|
|
|
|
return 0;
|
|
}
|