2010年3月7日日曜日

flickr apiで iPhoneの撮影角度を補正するPythonスクリプト はてなブックマークに追加

夏にiPhone3GSを買ってGeoTag付きデジカメ2台体制で日々GeoTagに個人情報だだ漏れさせた画像をflickrにアップしておりますが、Nikon COOLPIXP6000と違いiPhoneには撮影角度情報があってその情報を利用すれば、手動で写真の回転する作業から解放されるので早速Pythonで角度を回転するするスクリプトを書いてみました。


pythonスクリプトの説明
1.画像の回転は認証が必要なので確認する。
2.3日以前に投稿した写真を400枚取得する
3.画像のIDからexifデータを取得する
4.exifから”Orientation”を探す。
5.文字列から撮影角度を取得し、画像を回転させる。

ちなみにExifの”Orientation”のパターンは8種類あるようですが、iPhone3GSでは4つしか出てこないようなので対応していません。”Orientation”パターンを探している方や、iPhone3GS以外も対応したい場合は、Exif Orientationタグによる補正方法 - オレBlogさんの情報が参考になるとおもいます。

%orientation = (
1 => 'Horizontal (normal)',
2 => 'Mirror horizontal',
3 => 'Rotate 180',
4 => 'Mirror vertical',
5 => 'Mirror horizontal and rotate 270 CW',
6 => 'Rotate 90 CW',
7 => 'Mirror horizontal and rotate 90 CW',
8 => 'Rotate 270 CW',
);

Exif Orientationタグによる補正方法 - オレBlog


  1. # coding: UTF-8  
  2. import flickrapi  
  3. import re  
  4. import time  
  5.   
  6. api_key = 'xxxxxxx'  
  7. secret_key = 'yyyyyy'  
  8. my_id = 'zzzz@N00'  
  9.   
  10. flickr = flickrapi.FlickrAPI(api_key,secret_key)  
  11. #auth  
  12. (token, frob) = flickr.get_token_part_one(perms='write')  
  13. if not token: raw_input("Press ENTER after you authorized this program")  
  14. flickr.get_token_part_two((token, frob))  
  15.   
  16. mt =  int(time.time()-24*60*60*3)  
  17. search = flickr.photos_search(user_id=my_id,min_upload_date=mt,per_page=400,page=1)  
  18.   
  19. for photo in search.find("photos").findall('photo'):  
  20.     photoid  = photo.attrib['id']  
  21.     getexif = flickr.photos_getExif(photo_id = photoid )  
  22.     e= getexif.find("photo").findall('exif')  
  23.     if( e):  
  24.       try:  
  25.         rot =  ""  
  26.         print photoid + " " + photo.attrib['title']  
  27.         for exif in e:  
  28.             label = exif.attrib["label"]  
  29.             if( label == 'Orientation' ):  
  30.                 rot =  exif.find("raw").text  
  31.         if rot == "Rotate 90 CW":  
  32.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 90)  
  33.         elif rot == "Rotate 270 CW":  
  34.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 270 )  
  35.         elif rot == "Rotate 180":  
  36.             flickr.photos_transform_rotate(photo_id = photoid,degrees = 180)  
  37.         elif  rot == 'Horizontal (normal)':  
  38.             pass  
  39.   
  40.       except AttributeError:  
  41.           print "error"  
  42.           continue  
  43.       except FlickrError:  
  44.           print "error"  
  45.           continue  

※エラーがあっても無視するようにしてます。
※Macの場合はiPhotoだと取り込んだ時点で自動で画像の回転し、そのうえにFlickrへの投稿ボタンまで用意されているので、自作スクリプトで対応する必要はないのですが、中途半端に自作スクリプトに自分専用の便利機能をつけてしまったのでiPhoto移行できずに日々車輪の再発明を続けております。

0 件のコメント: