Day: April 28, 2015

便利にMac:自動起動アプリの停止の仕方

ここ数日、再起動したログイン直後の調子が悪いので、自動起動アプリを外してみました。

Mac OS X 10.10.4(beta?)に先程アップデートして、それでも再起動直後の様子がおかしいので、自動起動するアプリのうち次のものを外しました。

  • キヤノンデジカメ関係のアプリ
  • Flickrのアップローダー

自動起動させない方法をすぐに思いつかなかったので、メモしておきます。

システム環境設定➡️ユーザーとグループ

チェックが入っているものを自動起動しないようにしたつもりだったのですが、チェックを入れただけではダメで、しっかり一覧から削除しないといけませんでした。

スクリーンショット 2015-04-28 20.28.31結果、OKになりました。再ログイン直後にWi-Fiがぐずぐずしていたり、ウイルス対策ソフトやんVPNの立ち上がりが悪いようでしたら、自動起動しているアプリケーションを見直した方がいいです。頻繁に使わなかったり、手動でも構わないものなら、わざわざ便利さを取って障害を引き起こすのは考えものです。

Swift:EXIFの書き込み

EXIFの書き込みは、当初シナリオ通り、写真ファイルと一緒に書き込むことで実現しました。

これは、正直、よくわかっていません。

UIImagePickerControllerで撮影した写真にExif・位置情報を書き込んで保存する方法Swiftを使って「ハワイに行ったふりカメラ」をつくるなどを見るには見たのですが、Objective-Cだったり、内容が少し違うような気がして、徹底して追求する根気がありませんでした。

それでも、何となく次のようにやったらEXIFの書き込みができてしまいました。もしかすると、まちがいがあるかもしれませんが、今後、UIを作っていく段階でバグがあれば修正する機会があると思います。

func execWriteEXIF(pFilepath:String, pEXIF:NSDictionary, pExportFilepath:String) { //
var wimageURL: NSURL = NSURL(fileURLWithPath: pFilepath)! //写真のFilepathからNSURLを作成する。
var cgImage:CGImageSourceRef = CGImageSourceCreateWithURL (wimageURL, nil)//イメージソース作成
var imageData:NSMutableData = NSMutableData()//
var dest:CGImageDestinationRef  = CGImageDestinationCreateWithData (imageData, CGImageSourceGetType(cgImage), 1, nil)//
CGImageDestinationAddImageFromSource (dest, cgImage, 0, pEXIF as Dictionary )//
CGImageDestinationFinalize(dest) //
imageData.writeToFile(pExportFilepath, atomically: true) //写真ファイルの書き込み
}

細かい話として、緯度・経度のシンタクス・チェックをきっちりしないと、プレビューが落ちます。90度、180度、60分、60秒の最大値チェックとEWNSチェックは必須。また、-はマイナスでなく区切りのようです。これは、除去しないといけません。

Swift:EXIFを書き換え

第一段階として、GPS辞書の変換・削除・差し替え、EXIFを書き換えができるようになりました。

ちょっとしたことなのですが、時間がかかってしまいました。いろいろ調べたのですが、残念なことに決め手になるものを見つけられませんでした。

NSDictionaryとDictionaryの相互変換

いくつか重要なことがあると思われますので、メモします。

  • NSDictionaryはwDicGPS[kCGImagePropertyGPSLatitude] = wGPS.pLatiのような書き方で簡単に値の変更ができません。一方、EXIF辞書はNSDictionaryでないと読み込み・書き込みができないようです。それでNSDictionaryにEXIFを読み込み → Dictionary & 値の設定・変更 → NSDictionary → 書き込みという手順を踏まえたら、EXIFの書き換えができました。

var mm_EXIF:NSDictionary  = NSDictionary()
var mm_GPS:NSDictionary = NSDictionary()

  • それで、一旦、Dictionaryに変換してから値をセットし、そのあとでNSDictionaryに戻せばうまくことがわかりました。
  • NSDictionaryへの読み込み

mm_EXIF = CGImageSourceCopyPropertiesAtIndex (wimageRef, 0, nil)
mm_GPS  = mm_EXIF.objectForKey (kCGImagePropertyGPSDictionary) as! NSDictionary

  • Dictionaryへの変換 ワーク用のDictionaryをグローバル変数で定義するとエラーが発生します。

var wDicEXIF:Dictionary = mm_EXIF   as Dictionary
var wDicGPS:Dictionary  = mm_GPS

  • Dictionaryに値を設定

wDicGPS[kCGImagePropertyGPSLatitude]  = wGPS.pLati//緯度

  • 書き換えするためにNSDictionaryに再変換

wDicEXIF.removeValueForKey (kCGImagePropertyGPSDictionary)//GPS削除
wDicEXIF[kCGImagePropertyGPSDictionary] = wDicGPS//GPS追加
mm_EXIF = wDicEXIF//NSDictionaryに再変換

このあと、jpgファイルといっしょにmm_EXIFを書き込めばEXIFの更新ができます。

参考:NSArrayやNSDictionaryを、SwiftのArrayやDictionaryと相互変換