Loading src/exif.c +179 −67 Original line number Diff line number Diff line /* exif.c Copyright (C) 2012 Dennis Real. Copyright (C) 2021 Daniel Friesel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to Loading Loading @@ -155,6 +156,115 @@ void exif_get_mnote_tag(ExifData * d, unsigned int tag, char *buffer, } } void exif_get_make_model_lens(ExifData * ed, char *buffer, unsigned int maxsize) { char make[EXIF_STD_BUF_LEN]; char model[EXIF_STD_BUF_LEN]; char lens[EXIF_STD_BUF_LEN]; unsigned int offset = 0; make[0] = model[0] = lens[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_MAKE, make, sizeof(make)); exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_MODEL, model, sizeof(model)); exif_get_tag_content(ed, EXIF_IFD_EXIF, 0xa434, lens, sizeof(lens)); if (make[0] && strncmp(make, model, strlen(make)) != 0) { offset += snprintf(buffer, maxsize, "%s ", make); } if (model[0]) { offset += snprintf(buffer + offset, maxsize - offset, "%s", model); } if (lens[0]) { offset += snprintf(buffer + offset, maxsize - offset, " + %s", lens); } snprintf(buffer + offset, maxsize - offset, "\n"); } void exif_get_exposure(ExifData * ed, char *buffer, unsigned int maxsize) { char fnumber[EXIF_STD_BUF_LEN]; char exposure[EXIF_STD_BUF_LEN]; char iso[EXIF_STD_BUF_LEN]; char focus[EXIF_STD_BUF_LEN]; char focus35[EXIF_STD_BUF_LEN]; unsigned int offset = 0; fnumber[0] = exposure[0] = iso[0] = '\0'; focus[0] = focus35[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FNUMBER, fnumber, sizeof(fnumber)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME, exposure, sizeof(exposure)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS, iso, sizeof(iso)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH, focus, sizeof(focus)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM, focus35, sizeof(focus35)); if (fnumber[0] || exposure[0]) { offset += snprintf(buffer, maxsize, "%s %s ", fnumber, exposure); } if (iso[0]) { offset += snprintf(buffer + offset, maxsize - offset, "ISO%s ", iso); } if (focus[0] && focus35[0]) { snprintf(buffer + offset, maxsize - offset, "%s (%s mm)\n", focus, focus35); } else if (focus[0]) { snprintf(buffer + offset, maxsize - offset, "%s\n", focus); } } void exif_get_flash(ExifData * ed, char *buffer, unsigned int maxsize) { char flash[EXIF_STD_BUF_LEN]; flash[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH, flash, sizeof(flash)); if (flash[0]) { snprintf(buffer, maxsize, "%s\n", flash); } } void exif_get_mode(ExifData * ed, char *buffer, unsigned int maxsize) { char mode[EXIF_STD_BUF_LEN]; char program[EXIF_STD_BUF_LEN]; mode[0] = program[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE, mode, sizeof(mode)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_PROGRAM, program, sizeof(program)); if (mode[0] || program[0]) { snprintf(buffer, maxsize, "%s (%s)\n", mode, program); } } void exif_get_datetime(ExifData * ed, char *buffer, unsigned int maxsize) { char datetime[EXIF_STD_BUF_LEN]; datetime[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, datetime, sizeof(datetime)); if (datetime[0]) { snprintf(buffer, maxsize, "%s\n", datetime); } } void exif_get_description(ExifData * ed, char *buffer, unsigned int maxsize) { char description[EXIF_STD_BUF_LEN]; description[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION, description, sizeof(description)); if (description[0]) { snprintf(buffer, maxsize, "\"%s\"\n", description); } } /* get gps coordinates if available */ Loading Loading @@ -247,17 +357,21 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize) snprintf(buffer, (size_t) maxsize, "%s\n", "No Exif data in file."); return; } else { /* show normal exif tags. list must be defined in exif_cfg.h */ while ((i < USHRT_MAX) && (Exif_tag_list[i].ifd != EXIF_IFD_COUNT)) { exif_get_tag(ed, Exif_tag_list[i].ifd, Exif_tag_list[i].tag, buffer + strlen(buffer), maxsize - strlen(buffer)); i++; } exif_get_description(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_make_model_lens(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_exposure(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_mode(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_flash(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_datetime(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); /* show vendor specific makernote tags */ entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], Loading Loading @@ -322,6 +436,4 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize) } } #endif src/exif_cfg.h +0 −31 Original line number Diff line number Diff line Loading @@ -28,37 +28,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <libexif/exif-data.h> typedef struct { ExifIfd ifd; /* section */ ExifTag tag; /* tag */ } t_EXIF_INFO; /* show these standard tags. section must be given first, than the tag itself */ /* definition: http://libexif.sourceforge.net/api/exif-tag_8h.html */ const t_EXIF_INFO Exif_tag_list[] = { { EXIF_IFD_0, EXIF_TAG_MAKE }, { EXIF_IFD_0, EXIF_TAG_MODEL }, { EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION }, { EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME }, { EXIF_IFD_EXIF, EXIF_TAG_SHUTTER_SPEED_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_FNUMBER }, { EXIF_IFD_EXIF, EXIF_TAG_APERTURE_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS }, { EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH }, { EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_PROGRAM }, { EXIF_IFD_EXIF, EXIF_TAG_SCENE_CAPTURE_TYPE }, { EXIF_IFD_EXIF, EXIF_TAG_FLASH }, { EXIF_IFD_COUNT, 0 } /* end marker */ }; /* Nikon */ #define EXIF_NIKON_MAKERNOTE_END 0 /* end marker: if 0 used as a tag we must find something else */ Loading Loading
src/exif.c +179 −67 Original line number Diff line number Diff line /* exif.c Copyright (C) 2012 Dennis Real. Copyright (C) 2021 Daniel Friesel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to Loading Loading @@ -155,6 +156,115 @@ void exif_get_mnote_tag(ExifData * d, unsigned int tag, char *buffer, } } void exif_get_make_model_lens(ExifData * ed, char *buffer, unsigned int maxsize) { char make[EXIF_STD_BUF_LEN]; char model[EXIF_STD_BUF_LEN]; char lens[EXIF_STD_BUF_LEN]; unsigned int offset = 0; make[0] = model[0] = lens[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_MAKE, make, sizeof(make)); exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_MODEL, model, sizeof(model)); exif_get_tag_content(ed, EXIF_IFD_EXIF, 0xa434, lens, sizeof(lens)); if (make[0] && strncmp(make, model, strlen(make)) != 0) { offset += snprintf(buffer, maxsize, "%s ", make); } if (model[0]) { offset += snprintf(buffer + offset, maxsize - offset, "%s", model); } if (lens[0]) { offset += snprintf(buffer + offset, maxsize - offset, " + %s", lens); } snprintf(buffer + offset, maxsize - offset, "\n"); } void exif_get_exposure(ExifData * ed, char *buffer, unsigned int maxsize) { char fnumber[EXIF_STD_BUF_LEN]; char exposure[EXIF_STD_BUF_LEN]; char iso[EXIF_STD_BUF_LEN]; char focus[EXIF_STD_BUF_LEN]; char focus35[EXIF_STD_BUF_LEN]; unsigned int offset = 0; fnumber[0] = exposure[0] = iso[0] = '\0'; focus[0] = focus35[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FNUMBER, fnumber, sizeof(fnumber)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME, exposure, sizeof(exposure)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS, iso, sizeof(iso)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH, focus, sizeof(focus)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM, focus35, sizeof(focus35)); if (fnumber[0] || exposure[0]) { offset += snprintf(buffer, maxsize, "%s %s ", fnumber, exposure); } if (iso[0]) { offset += snprintf(buffer + offset, maxsize - offset, "ISO%s ", iso); } if (focus[0] && focus35[0]) { snprintf(buffer + offset, maxsize - offset, "%s (%s mm)\n", focus, focus35); } else if (focus[0]) { snprintf(buffer + offset, maxsize - offset, "%s\n", focus); } } void exif_get_flash(ExifData * ed, char *buffer, unsigned int maxsize) { char flash[EXIF_STD_BUF_LEN]; flash[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH, flash, sizeof(flash)); if (flash[0]) { snprintf(buffer, maxsize, "%s\n", flash); } } void exif_get_mode(ExifData * ed, char *buffer, unsigned int maxsize) { char mode[EXIF_STD_BUF_LEN]; char program[EXIF_STD_BUF_LEN]; mode[0] = program[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE, mode, sizeof(mode)); exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_PROGRAM, program, sizeof(program)); if (mode[0] || program[0]) { snprintf(buffer, maxsize, "%s (%s)\n", mode, program); } } void exif_get_datetime(ExifData * ed, char *buffer, unsigned int maxsize) { char datetime[EXIF_STD_BUF_LEN]; datetime[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, datetime, sizeof(datetime)); if (datetime[0]) { snprintf(buffer, maxsize, "%s\n", datetime); } } void exif_get_description(ExifData * ed, char *buffer, unsigned int maxsize) { char description[EXIF_STD_BUF_LEN]; description[0] = '\0'; exif_get_tag_content(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION, description, sizeof(description)); if (description[0]) { snprintf(buffer, maxsize, "\"%s\"\n", description); } } /* get gps coordinates if available */ Loading Loading @@ -247,17 +357,21 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize) snprintf(buffer, (size_t) maxsize, "%s\n", "No Exif data in file."); return; } else { /* show normal exif tags. list must be defined in exif_cfg.h */ while ((i < USHRT_MAX) && (Exif_tag_list[i].ifd != EXIF_IFD_COUNT)) { exif_get_tag(ed, Exif_tag_list[i].ifd, Exif_tag_list[i].tag, buffer + strlen(buffer), maxsize - strlen(buffer)); i++; } exif_get_description(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_make_model_lens(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_exposure(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_mode(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_flash(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); exif_get_datetime(ed, buffer + strlen(buffer), maxsize - strlen(buffer)); /* show vendor specific makernote tags */ entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], Loading Loading @@ -322,6 +436,4 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize) } } #endif
src/exif_cfg.h +0 −31 Original line number Diff line number Diff line Loading @@ -28,37 +28,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <libexif/exif-data.h> typedef struct { ExifIfd ifd; /* section */ ExifTag tag; /* tag */ } t_EXIF_INFO; /* show these standard tags. section must be given first, than the tag itself */ /* definition: http://libexif.sourceforge.net/api/exif-tag_8h.html */ const t_EXIF_INFO Exif_tag_list[] = { { EXIF_IFD_0, EXIF_TAG_MAKE }, { EXIF_IFD_0, EXIF_TAG_MODEL }, { EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION }, { EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME }, { EXIF_IFD_EXIF, EXIF_TAG_SHUTTER_SPEED_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_FNUMBER }, { EXIF_IFD_EXIF, EXIF_TAG_APERTURE_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE }, { EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS }, { EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH }, { EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE }, { EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_PROGRAM }, { EXIF_IFD_EXIF, EXIF_TAG_SCENE_CAPTURE_TYPE }, { EXIF_IFD_EXIF, EXIF_TAG_FLASH }, { EXIF_IFD_COUNT, 0 } /* end marker */ }; /* Nikon */ #define EXIF_NIKON_MAKERNOTE_END 0 /* end marker: if 0 used as a tag we must find something else */ Loading