1b8bc0d8aSopenharmony_ci/*
2b8bc0d8aSopenharmony_ci * libexif example program to extract an EXIF thumbnail from an image
3b8bc0d8aSopenharmony_ci * and save it into a new file.
4b8bc0d8aSopenharmony_ci *
5b8bc0d8aSopenharmony_ci * Placed into the public domain by Dan Fandrich
6b8bc0d8aSopenharmony_ci */
7b8bc0d8aSopenharmony_ci
8b8bc0d8aSopenharmony_ci#include <stdio.h>
9b8bc0d8aSopenharmony_ci#include <libexif/exif-loader.h>
10b8bc0d8aSopenharmony_ci
11b8bc0d8aSopenharmony_ciint main(int argc, char **argv)
12b8bc0d8aSopenharmony_ci{
13b8bc0d8aSopenharmony_ci    int rc = 1;
14b8bc0d8aSopenharmony_ci    ExifLoader *l;
15b8bc0d8aSopenharmony_ci
16b8bc0d8aSopenharmony_ci    if (argc < 2) {
17b8bc0d8aSopenharmony_ci        printf("Usage: %s image.jpg\n", argv[0]);
18b8bc0d8aSopenharmony_ci        printf("Extracts a thumbnail from the given EXIF image.\n");
19b8bc0d8aSopenharmony_ci        return rc;
20b8bc0d8aSopenharmony_ci    }
21b8bc0d8aSopenharmony_ci
22b8bc0d8aSopenharmony_ci    /* Create an ExifLoader object to manage the EXIF loading process */
23b8bc0d8aSopenharmony_ci    l = exif_loader_new();
24b8bc0d8aSopenharmony_ci    if (l) {
25b8bc0d8aSopenharmony_ci        ExifData *ed;
26b8bc0d8aSopenharmony_ci
27b8bc0d8aSopenharmony_ci        /* Load the EXIF data from the image file */
28b8bc0d8aSopenharmony_ci        exif_loader_write_file(l, argv[1]);
29b8bc0d8aSopenharmony_ci
30b8bc0d8aSopenharmony_ci        /* Get a pointer to the EXIF data */
31b8bc0d8aSopenharmony_ci        ed = exif_loader_get_data(l);
32b8bc0d8aSopenharmony_ci
33b8bc0d8aSopenharmony_ci	/* The loader is no longer needed--free it */
34b8bc0d8aSopenharmony_ci        exif_loader_unref(l);
35b8bc0d8aSopenharmony_ci	l = NULL;
36b8bc0d8aSopenharmony_ci        if (ed) {
37b8bc0d8aSopenharmony_ci	    /* Make sure the image had a thumbnail before trying to write it */
38b8bc0d8aSopenharmony_ci            if (ed->data && ed->size) {
39b8bc0d8aSopenharmony_ci                FILE *thumb;
40b8bc0d8aSopenharmony_ci                char thumb_name[1024];
41b8bc0d8aSopenharmony_ci
42b8bc0d8aSopenharmony_ci		/* Try to create a unique name for the thumbnail file */
43b8bc0d8aSopenharmony_ci                snprintf(thumb_name, sizeof(thumb_name),
44b8bc0d8aSopenharmony_ci                         "%s_thumb.jpg", argv[1]);
45b8bc0d8aSopenharmony_ci
46b8bc0d8aSopenharmony_ci                thumb = fopen(thumb_name, "wb");
47b8bc0d8aSopenharmony_ci                if (thumb) {
48b8bc0d8aSopenharmony_ci		    /* Write the thumbnail image to the file */
49b8bc0d8aSopenharmony_ci                    fwrite(ed->data, 1, ed->size, thumb);
50b8bc0d8aSopenharmony_ci                    fclose(thumb);
51b8bc0d8aSopenharmony_ci                    printf("Wrote thumbnail to %s\n", thumb_name);
52b8bc0d8aSopenharmony_ci                    rc = 0;
53b8bc0d8aSopenharmony_ci                } else {
54b8bc0d8aSopenharmony_ci                    printf("Could not create file %s\n", thumb_name);
55b8bc0d8aSopenharmony_ci                    rc = 2;
56b8bc0d8aSopenharmony_ci                }
57b8bc0d8aSopenharmony_ci            } else {
58b8bc0d8aSopenharmony_ci                printf("No EXIF thumbnail in file %s\n", argv[1]);
59b8bc0d8aSopenharmony_ci                rc = 1;
60b8bc0d8aSopenharmony_ci            }
61b8bc0d8aSopenharmony_ci	    /* Free the EXIF data */
62b8bc0d8aSopenharmony_ci            exif_data_unref(ed);
63b8bc0d8aSopenharmony_ci        }
64b8bc0d8aSopenharmony_ci    }
65b8bc0d8aSopenharmony_ci    return rc;
66b8bc0d8aSopenharmony_ci}
67