Jpg Image Exif 출력하기

 
Introduction

사진촬영을 할때, GPS가 내장된 기기에서는 자동으로 위치정보를 사진에 기록하게 됩니다. 이러한 사진들을 수집하여, 지도위에 나타내거나 혹은 여러가지로 LBM 시스템을 만들 수 있습니다. 하지만, 저는 GPS정보를 이용하여 단순히 촬영 된 사진을 일자/GPS정보 등을 이용하여 분류하고자 합니다. 물론 CNN등을 이용하여 분류할 계획도 하고 있지만, step by step 할꺼니까. 필요한 모듈을 먼저 만들고나서, 하나의 덩어리로 뭉칠 계획입니다. 
 
그래서 온라인에 exif 를 parsing 하는 모듈을 꽤 찾아봤습니다. 물론 소스코드가 길다고 좋은 코드가 아니기때문에 필요한 정보가 나오는 코드가 있으면 전부 정리해서 테스트를 해보았습니다. 그리고 향후 작업을 위해서 visual studio 2019 x64 에서 돌아가야하기때문에 VS 하위버전에서만 돌아가는 부분들의 코드들을 죄다 archive 하였습니다.  향후, 코드에서 필요한 부분만 적출해서 쓰면될 것 같아서 말이죠 ㅎㅎ 그럼 이제 어떤 모듈을 사용하는지 살펴보도록 할까요?
 
Exif 출력하기

개발환경은 visual studio 2019 / C,C++ 기반에서 진행하였습니다. 
 
 
github 코드를 가지고왔습니다. 다른 codeproject 등 예제 코드를 많이 보았지만, 간단한게 제일 좋더군요.  해당 코드는 visual studio 2019에서 프로젝트를 생성하고, exif.cpp, exif.h, demo.cpp 파일을 추가 합니다.  몇가지 오류가 뜨긴하지만, 아래의 코드를 적절한 곳에 위치해주시면 됩니다. 
 
#pragma warning(disable : 4996) //: fopen, fscanf, sprintf
 
 
그리고 main 코드는 다음과 같습니다. 
 
// 생략

int main(int argc, char *argv[]) { 

  // Read the JPEG file into a buffer
  //FILE *fp = fopen(argv[1], "rb");
  FILE *fp = fopen("test.jpg", "rb");
  if (!fp) {
    printf("Can't open file.\n");
    return -1;
  }
  fseek(fp, 0, SEEK_END);
  unsigned long fsize = ftell(fp);
  rewind(fp);
  unsigned char *buf = new unsigned char[fsize];
  if (fread(buf, 1, fsize, fp) != fsize) {
    printf("Can't read file.\n");
    delete[] buf;
    return -2;
  }
  fclose(fp);

// .. 계속
 
먼저 main 구문 상단에는 파일을 확인하는 작업을 진행합니다. 
 
  // Parse EXIF
  easyexif::EXIFInfo result;
  int code = result.parseFrom(buf, fsize);
  delete[] buf;
  if (code) {
    printf("Error parsing EXIF: code %d\n", code);
    return -3;
  }
 
그리고 Parsing 하는 부분의 코드입니다. 파일명(string) 형태로 전달하게 됩니다. 
 

 

 

 
  // Dump EXIF information
  printf("Camera make          : %s\n", result.Make.c_str());
  printf("Camera model         : %s\n", result.Model.c_str());
  printf("Software             : %s\n", result.Software.c_str());
  printf("Bits per sample      : %d\n", result.BitsPerSample);
  printf("Image width          : %d\n", result.ImageWidth);
  printf("Image height         : %d\n", result.ImageHeight);
  printf("Image description    : %s\n", result.ImageDescription.c_str());
  printf("Image orientation    : %d\n", result.Orientation);
  printf("Image copyright      : %s\n", result.Copyright.c_str());
  printf("Image date/time      : %s\n", result.DateTime.c_str());
  printf("Original date/time   : %s\n", result.DateTimeOriginal.c_str());
  printf("Digitize date/time   : %s\n", result.DateTimeDigitized.c_str());
  printf("Subsecond time       : %s\n", result.SubSecTimeOriginal.c_str());
  printf("Exposure time        : 1/%d s\n",
         (unsigned)(1.0 / result.ExposureTime));
  printf("F-stop               : f/%.1f\n", result.FNumber);
  printf("ISO speed            : %d\n", result.ISOSpeedRatings);
  printf("Subject distance     : %f m\n", result.SubjectDistance);
  printf("Exposure bias        : %f EV\n", result.ExposureBiasValue);
  printf("Flash used?          : %d\n", result.Flash);
  printf("Metering mode        : %d\n", result.MeteringMode);
  printf("Lens focal length    : %f mm\n", result.FocalLength);
  printf("35mm focal length    : %u mm\n", result.FocalLengthIn35mm);
  printf("GPS Latitude         : %f deg (%f deg, %f min, %f sec %c)\n",
         result.GeoLocation.Latitude, result.GeoLocation.LatComponents.degrees,
         result.GeoLocation.LatComponents.minutes,
         result.GeoLocation.LatComponents.seconds,
         result.GeoLocation.LatComponents.direction);
  printf("GPS Longitude        : %f deg (%f deg, %f min, %f sec %c)\n",
         result.GeoLocation.Longitude, result.GeoLocation.LonComponents.degrees,
         result.GeoLocation.LonComponents.minutes,
         result.GeoLocation.LonComponents.seconds,
         result.GeoLocation.LonComponents.direction);
  printf("GPS Altitude         : %f m\n", result.GeoLocation.Altitude);
  printf("GPS Precision (DOP)  : %f\n", result.GeoLocation.DOP);
  printf("Lens min focal length: %f mm\n", result.LensInfo.FocalLengthMin);
  printf("Lens max focal length: %f mm\n", result.LensInfo.FocalLengthMax);
  printf("Lens f-stop min      : f/%.1f\n", result.LensInfo.FStopMin);
  printf("Lens f-stop max      : f/%.1f\n", result.LensInfo.FStopMax);
  printf("Lens make            : %s\n", result.LensInfo.Make.c_str());
  printf("Lens model           : %s\n", result.LensInfo.Model.c_str());
  printf("Focal plane XRes     : %f\n", result.LensInfo.FocalPlaneXResolution);
  printf("Focal plane YRes     : %f\n", result.LensInfo.FocalPlaneYResolution);

  return 0;
}
 
그리고 입력된 결과 값을 출력을 저렇게 하고 있어서...수정이 좀 필요하죠? 저는 블로그 포스팅 하는 시점에 필요한 만큼 코드를 wrapping 하였기때문에 상관없지만, 원하는 형태대로 출력하기위해서는 손을 좀 보는게 좋을듯 합니다. 
 
참고로, DSLR에서 촬영한 사진의 GPS정보가 왜 출력안되는지 몰랐는데, 실내에서 촬영한 사진은 GPS정보를 얻지 못해서 없는 사진들이 꽤 많더군요. 작업하는데는 상관없지만, 그래도 조금 아쉽더군요. 
그리고 jpg 파일 외 다른 이미지도 가능한지도 확인해보시길 바랍니다. 숙제 숙제~
 
아참 결과물!
 
 
 
 
 
 
 
 
 
 
 
 
 

이 글을 공유하기

댓글(0)

Designed by JB FACTORY