Swift

Swift:Lossless指定とメタ情報の削除

長い間、調べてもよくわからなかったので「Lossless指定とメタ情報の削除の仕方」は後回しにしていました。

きょう、心を入れ替えて調査したところ、とても簡単なことでした。このあと、メタ情報の削除を指示するUIを追加して仕上げます。現在、最終確認中です。この方式の問題有無についてはあとでupdateします。

(追記)機能実装した結果、メタ情報削除が想定通り動作していないことが判明。やれやれ。
➡️ 一日あれこれやってみたのですが、適切な方法が見つかりませんでした。ぬか喜びになってしまいました。しかし、あれは何だったのでしょうか。幻だったのでしょうか。

  • removeValueForKeyも読み込んだメタ情報に対してはハンドリングできますが、これを書き込む方法がわかりません。
  • CGImageDestinationAddImageを使えばいいような気がしますが、CGImageで写真を読み込む方法までたどり着けていません。
  • 時間がないので、削除ではなく、初期値でクリアする方法で対処。実装しました。

ポイント:

  • 5行目:LosslessはkCGImageDestinationLossyCompressionQuality指定します。1.00はLossless。
    最終的には、8行目に示すようにpropertiesで食わせます。
  • Lossless指示と編集・修正したメタ情報(ここでははpDictAll)はマージが必要なので、実際は、6、7行目のようにすればいいです。
  • メタ情報を削除したい場合、9行目のようにpropertiesをnilにすればいいです。
    ➡️これはまちがい。参考にたらダメ。nilにしても辞書の削除はできない。やれやれ。
  • 11行目のpExportFilepathは、この写真とメタ情報を書き出す先のfilepathになります。なお、1行目のpFilepathは読み込んだ写真のfilepathです。
  1. let wimageURL: NSURL = NSURL(fileURLWithPath: pFilepath)
  2. let wCGImageSource:CGImageSourceRef = CGImageSourceCreateWithURL(wimageURL, nil)!
  3. let wImageData:NSMutableData    = NSMutableData()
  4. let wCGImageDestination:CGImageDestinationRef  = CGImageDestinationCreateWithData(wImageData, CGImageSourceGetType(wCGImageSource)!, 1, nil)!
  5. var wOptions: [String:AnyObject] = [kCGImageDestinationLossyCompressionQuality as String : 1.00]
  6. var wOptions = pDictAll as! Dictionary
  7. wOptions.updateValue(1.00, forKey: kCGImageDestinationLossyCompressionQuality as String)
  8. CGImageDestinationAddImageFromSource(wCGImageDestination, wCGImageSource, 0, wOptions)
  9. CGImageDestinationAddImageFromSource(wCGImageDestination, wCGImageSource, 0, nil)
  10. CGImageDestinationFinalize(wCGImageDestination)
  11. wImageData.writeToFile(pExportFilepath, atomically: true)

Categories: Swift, 技術