Exif extractor - codeport/scala GitHub Wiki

EXIF(Exchangeable image file format) 추출하기

Scala를 이용해 다수의 이미지 파일에서 메타데이터를 추출해 보자.

준비물

  • Eclipse로 scala 프로젝트 수행 준비(Scala 버전 2.9이상)
  • 23장의 내용을 읽고 자신이 작성한 객체를 for문에서 generator로 활용할 수 있도록 수련함
  • Collection filter, map, flatMap 메서드 사용법
  • Stream에 대한 가벼운 사전 지식
    • 진행 시 처리 대상 정보가 Stream객체에 담겨져 전달될 예정

EXIF란?

EXIF 정보 확인 방법

  • 특정 이미지의 EXIF 정보는 미리보기, picasa, flickr, chrome extension등 다양한 방법으로 확인 가능
  • 알아서 EXIF 정보를 확인할 수 있으면 됨
  • 참고로 크롬 확장도 있음(유용한지는 모르겠음)
  • 확인하면 알 수 있듯이 아주 많은 정보를 포함하고 있으므로 선별하여 작업할 것

작업 진행 순서

  1. 대상 파일 추출

    • 실제 동작은 console에서 수행

    • sys.process를 활용해 처리 대상 파일명을 구함

      • import sys.process._

      • implicit type conversion을 이용하여 문자열에 !추가

          "ls -al" !
          "ls ~/images" lines_!
        
    • jpg 또는 png 이미지 파일 찾기(xnix)

        find . -type f -name "*.jpg" -or -name "*.png" 
      
    • 예제: 일정 크기(100kb) 이하의 png 파일만 골라내기

        "find /Users/nephilim/images -type f -name *.png"
          .lines_!
          .filter( new java.io.File(_).length < 100 * 1000 )
      
  2. 대상 파일의 exif 정보 출력

    • 라이브러리: image에서 부가 정보를 추출하는 metadata extractor 사용

    • metadata extractor 사이트의 GettingStarted의 내용만으로도 진행 가능함

        JpegMetadataReader.readMetadata(file)
      
    • SBT를 통한 의존성 관리: URL을 통한 직접 다운로드

    • build.sbt에 다음을 추가한다

        libraryDependencies += "metadata-extractor" % "metadata-extractor" % "2.6.1" from "file://lib/metadata-extractor-2.6.1.jar"
      
    • 정확히 표현 >> generator를 활용해 for 루프를 돌리면 metadata가 출력되도록 한다

  3. 원하는 정보를 추출

    • Metadata의 정보는 group인 Directory와 Directory에 속한 Tag가 있다.

    • 다음은() 2개의 Directory와 그에 속한 Tag의 예시임

        [GPS] GPS Version ID - 2.200
        [GPS] GPS Latitude Ref - N
        [GPS] GPS Latitude - 37.0?? 32.0' 5.399999999993383"
        [GPS] GPS Longitude Ref - E
        [GPS] GPS Longitude - 126.0?? 59.0' 39.59999999998786"
        [GPS] GPS Time-Stamp - 23:45:3700 UTC
        [Exif Thumbnail] Thumbnail Compression - JPEG (old-style)
        [Exif Thumbnail] X Resolution - 72 dots per inch
        [Exif Thumbnail] Y Resolution - 72 dots per inch
        [Exif Thumbnail] Resolution Unit - Inch
        [Exif Thumbnail] Thumbnail Offset - 952 bytes
        [Exif Thumbnail] Thumbnail Length - 9599 bytes
      
    • 예: 촬영 시각, GPS Directory 정보만 추출

    • 주의 metadata-extractor 사용시 파일 경로는 canonical path로 사용할 것(home dir을 ~로 표기하면 동작하지 않음)

    • Sample Site 를 참고해서 결정하면 된다.

  4. 원하는 정보 추출 부분을 generator로 refactoring

    • extract metadata를 이용한 정보 추출의 예시(GPS)

        def extractGpsPos(metadata:Metadata):(String,String) = {
            import scala.collection.JavaConversions._
            val directory = metadata.getDirectory(classOf[GpsDirectory])
            val descriptor = new GpsDescriptor(directory)
            (descriptor.getGpsLatitudeDescription, descriptor.getGpsLongitudeDescription)
        }
      
    • map 만들기

      1. 직접 작성하기 혹은
      2. 만만한 collection을 상속
    • meta-extractor 사이트의 시작하기 페이지 를 참고한다.

    • 특정 폴더의 EXIF 정보를 읽는 클래스 작성 후 for 문을 이용해 추출한다.

    • flatMap, filter는 옵션

  5. visualize(옵션)

승부

  1. generator 완성도
  2. 추출한 gps 정보 활용도

추가 공유

  • 카메라로 찍은 사진(exif가 있는 사진)을 여럿가지고 올 것

    • 개수 10개 이상
    • 사진 정보를 볼 수 있는 프로그램(mac의 미리 보기, 이미지 뷰어...)을 이용해 어떤 정보가 있는지 확인.
  • 어떤 정보를 추출해서 활용할지 미리 정해 오면 좋음

    • gps정보 등