-
Notifications
You must be signed in to change notification settings - Fork 36
Exif extractor
Scala를 이용해 다수의 이미지 파일에서 메타데이터를 추출해 보자.
- Eclipse로 scala 프로젝트 수행 준비(Scala 버전 2.9이상)
- 23장의 내용을 읽고 자신이 작성한 객체를 for문에서 generator로 활용할 수 있도록 수련함
- Collection filter, map, flatMap 메서드 사용법
-
Stream에 대한 가벼운 사전 지식
- 진행 시 처리 대상 정보가 Stream객체에 담겨져 전달될 예정
- 특정 이미지의 EXIF 정보는 미리보기, picasa, flickr, chrome extension등 다양한 방법으로 확인 가능
- 알아서 EXIF 정보를 확인할 수 있으면 됨
- 참고로 크롬 확장도 있음(유용한지는 모르겠음)
- 확인하면 알 수 있듯이 아주 많은 정보를 포함하고 있으므로 선별하여 작업할 것
-
대상 파일 추출
-
실제 동작은 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 )
-
-
대상 파일의 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가 출력되도록 한다
-
-
원하는 정보를 추출
-
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 를 참고해서 결정하면 된다.
-
-
원하는 정보 추출 부분을 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 만들기
- 직접 작성하기 혹은
- 만만한 collection을 상속
-
meta-extractor 사이트의 시작하기 페이지 를 참고한다.
-
특정 폴더의 EXIF 정보를 읽는 클래스 작성 후 for 문을 이용해 추출한다.
-
flatMap, filter는 옵션
-
-
visualize(옵션)
- 추출한 정보를 응용할거리를 찾는다.
- 활용 예: GPS Visualizer 확인
- generator 완성도
- 추출한 gps 정보 활용도
-
카메라로 찍은 사진(exif가 있는 사진)을 여럿가지고 올 것
- 개수 10개 이상
- 사진 정보를 볼 수 있는 프로그램(mac의 미리 보기, 이미지 뷰어...)을 이용해 어떤 정보가 있는지 확인.
-
어떤 정보를 추출해서 활용할지 미리 정해 오면 좋음
- gps정보 등