1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/* 2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * libexif example program to extract an EXIF thumbnail from an image 3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * and save it into a new file. 4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Placed into the public domain by Dan Fandrich 6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdio.h> 9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-loader.h> 10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenint main(int argc, char **argv) 12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen int rc = 1; 14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifLoader *l; 15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (argc < 2) { 17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Usage: %s image.jpg\n", argv[0]); 18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Extracts a thumbnail from the given EXIF image.\n"); 19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return rc; 20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Create an ExifLoader object to manage the EXIF loading process */ 23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen l = exif_loader_new(); 24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (l) { 25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifData *ed; 26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Load the EXIF data from the image file */ 28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_loader_write_file(l, argv[1]); 29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Get a pointer to the EXIF data */ 31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ed = exif_loader_get_data(l); 32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* The loader is no longer needed--free it */ 34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_loader_unref(l); 35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen l = NULL; 36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (ed) { 37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Make sure the image had a thumbnail before trying to write it */ 38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (ed->data && ed->size) { 39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen FILE *thumb; 40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen char thumb_name[1024]; 41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Try to create a unique name for the thumbnail file */ 43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen snprintf(thumb_name, sizeof(thumb_name), 44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen "%s_thumb.jpg", argv[1]); 45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 46548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen thumb = fopen(thumb_name, "wb"); 47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (thumb) { 48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Write the thumbnail image to the file */ 49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fwrite(ed->data, 1, ed->size, thumb); 50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fclose(thumb); 51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Wrote thumbnail to %s\n", thumb_name); 52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rc = 0; 53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } else { 54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Could not create file %s\n", thumb_name); 55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rc = 2; 56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } else { 58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("No EXIF thumbnail in file %s\n", argv[1]); 59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen rc = 1; 60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* Free the EXIF data */ 62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_data_unref(ed); 63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return rc; 66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 67