Advertisement
kmb180

EXIF Tag Viewer

Feb 12th, 2014
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.71 KB | None | 0 0
  1. //Kevin Brough
  2. //kmb180
  3. #include <stdio.h>
  4. #include <string.h>
  5. struct header{
  6.     char start[2];
  7.     char app1[2];
  8.     char len_app_1[2];
  9.     char exif_data_string[4];
  10.     char NULL_zero[2];
  11.     char endian[2];
  12.     char v_num[2];
  13.     int offset;
  14. };
  15. struct tiff_header{
  16.     short tag_identifier;
  17.     char data_type[2];
  18.     int num_bytes;
  19.     int data_offset;
  20. };
  21. int main(int argc, char *argv[]){
  22.     FILE *f;
  23.     struct tiff_header tiff_hdr;
  24.     struct header hdr;
  25.     unsigned short count = 0;
  26.     int index = 0;
  27.     int E0 = 224;
  28.     int file_tracker = 12;//to keep track of where we last had the file pointer; begins at 12 because that's where the tags start
  29.     char data_string[256];
  30.     unsigned int u_int1; // for displaying ratios for type 5 data
  31.     unsigned int u_int2;
  32.     f = fopen(argv[1], "rb");
  33.     fread(&hdr, sizeof(hdr), 1, f);
  34.     if(hdr.app1[1] == E0){
  35.         printf("Error: Expected APP1");
  36.         return 1;
  37.     }
  38.     if(strcmp(hdr.endian, "MM") == 0){ // If what we got was MM is indeed MM then end program with error
  39.         printf("Error: Endianess not supported");
  40.         return 1;
  41.     }
  42.     fread(&count, sizeof(unsigned short), 1, f);
  43.     for(index; index<count; index++){
  44.         fread(&tiff_hdr, sizeof(tiff_hdr), 1, f);
  45.         if(tiff_hdr.tag_identifier == 0x010F){
  46.             file_tracker = ftell(f);
  47.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  48.             fread(data_string, tiff_hdr.num_bytes, 1, f);
  49.             printf("Manufacturer:\t%s\n", data_string);
  50.             fseek(f, file_tracker, SEEK_SET);
  51.         }
  52.         if(tiff_hdr.tag_identifier == 0x0110){
  53.             file_tracker = ftell(f);
  54.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  55.             fread(data_string, tiff_hdr.num_bytes, 1, f);
  56.             printf("Model:\t\t%s\n", data_string);
  57.             fseek(f, file_tracker, SEEK_SET);
  58.         }
  59.         if(tiff_hdr.tag_identifier == 0xffff8769){
  60.             index = 0;//restarting the loop
  61.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);//getting to the new tags
  62.             fread(&count, sizeof(unsigned short), 1, f); //and reading in that new count right after
  63.         }
  64.         if(tiff_hdr.tag_identifier == 0xffffA002){//type 4
  65.             file_tracker = ftell(f);
  66.             printf("Width:\t\t%u pixels\n", tiff_hdr.data_offset);
  67.         }
  68.         if(tiff_hdr.tag_identifier == 0xffffA003){//type 4
  69.             file_tracker = ftell(f);
  70.             printf("Height:\t\t%u pixels\n", tiff_hdr.data_offset);
  71.         }
  72.         if(tiff_hdr.tag_identifier == 0xffff8827){ //type 4
  73.             file_tracker = ftell(f);
  74.             printf("ISO:\t\tISO %u\n", tiff_hdr.data_offset);
  75.         }
  76.         if(tiff_hdr.tag_identifier == 0xffff829a){//type 5
  77.             file_tracker = ftell(f);
  78.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  79.             fread(&u_int1, sizeof(unsigned int), 1, f);//like with the rest of these type 5's we're reading in to unsigned ints
  80.             fread(&u_int2, sizeof(unsigned int), 1, f);
  81.             printf("Exposure Time:\t%u/%u second\n", u_int1, u_int2);
  82.             fseek(f, file_tracker, SEEK_SET);
  83.         }
  84.         if(tiff_hdr.tag_identifier == 0xffff829d){//type 5
  85.             file_tracker = ftell(f);
  86.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  87.             fread(&u_int1, sizeof(unsigned int), 1, f);
  88.             fread(&u_int2, sizeof(unsigned int), 1, f);
  89.             printf("F-stop:\t\tf/%.1f\n", (double)u_int1/u_int2);
  90.             fseek(f, file_tracker, SEEK_SET);
  91.         }
  92.         if(tiff_hdr.tag_identifier == 0xffff920A){//type 5
  93.             file_tracker = ftell(f);
  94.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  95.             fread(&u_int1, sizeof(unsigned int), 1, f);
  96.             fread(&u_int2, sizeof(unsigned int), 1, f);
  97.             printf("Focal Length:\t%u mm\n", u_int1/u_int2);
  98.             fseek(f, file_tracker, SEEK_SET);
  99.         }
  100.         if(tiff_hdr.tag_identifier == 0xffff9003){
  101.             file_tracker = ftell(f);
  102.             fseek(f, tiff_hdr.data_offset+12, SEEK_SET);
  103.             fread(data_string, tiff_hdr.num_bytes, 1, f);
  104.             printf("Date Taken:\t%s\n", data_string);
  105.             fseek(f, file_tracker, SEEK_SET);
  106.         }
  107.         file_tracker += 12;
  108.     }
  109.     fclose(f);
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement