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(์˜ต์…˜)

    • ์ถ”์ถœํ•œ ์ •๋ณด๋ฅผ ์‘์šฉํ• ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
    • ํ™œ์šฉ ์˜ˆ: GPS Visualizer ํ™•์ธ

์Šน๋ถ€

  1. generator ์™„์„ฑ๋„
  2. ์ถ”์ถœํ•œ gps ์ •๋ณด ํ™œ์šฉ๋„

์ถ”๊ฐ€ ๊ณต์œ 

  • ์นด๋ฉ”๋ผ๋กœ ์ฐ์€ ์‚ฌ์ง„(exif๊ฐ€ ์žˆ๋Š” ์‚ฌ์ง„)์„ ์—ฌ๋Ÿฟ๊ฐ€์ง€๊ณ  ์˜ฌ ๊ฒƒ

    • ๊ฐœ์ˆ˜ 10๊ฐœ ์ด์ƒ
    • ์‚ฌ์ง„ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ(mac์˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ, ์ด๋ฏธ์ง€ ๋ทฐ์–ด...)์„ ์ด์šฉํ•ด ์–ด๋–ค ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ.
  • ์–ด๋–ค ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์„œ ํ™œ์šฉํ• ์ง€ ๋ฏธ๋ฆฌ ์ •ํ•ด ์˜ค๋ฉด ์ข‹์Œ

    • gps์ •๋ณด ๋“ฑ