Swift

Swift:CGImageDestination

メタ情報の読み書きはCGImageDestinationを使えばいいようなので、調査中です。

今まで、次のように書いていたのですが、CGImageDestinationAddImageFromSourceの箇所をもう少し研究すれば追加・削除などができるようです。

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

Objective-Cですが、Stripping All Exif Data in Objective-CにWhen copying the images from the source to the destination, tell it that the appropriate keys (kCGImagePropertyExifDictionary and kCGImagePropertyGPSDictionary should be set to kCFNull), which according to the CGImageDestinationAddImageFromSource documentation is how you specify that those should be removed in the destination if they happened to appear in the sourceとあります。

ついでながら、let kCGImageDestinationLossyCompressionQuality: CFStringについて、 the value associated with this key must be a CFNumberRef data type in the range 0.0 to 1.0. A value of 1.0 specifies to use lossless compressionという記述がありました。ロスレスにするには、これを使いこなせばいいようです。

次のコードが参考になりそうなので見ています。

  • 辞書(メタ情報)を除く
    CGImageDestinationAddImageFromSource(dest, src, 0, nil)にあるようにnilを指定するだけのようです。Xcodeのヘルプも If a key in properties has the value kCFNull, the corresponding property in the image destination is removed.とあります。
    ➡️現時点では、nilが想定通りに動作しないことが判明。他方、kCFNullはCGIのキーワードに対してこのvalueを設定すると、Dictionaryからこのkeyword/valueが削除されるというに過ぎません。
    動いたのは錯誤?
  • ロスレスの指定
    kCGImageDestinationLossyCompressionQuality : 0.80を配列にしたものをCGImageDestinationAddImageのpropertiesで指定するサンプルがあります。つまり、上記、nilとロスレス1.0を配列にして食わせればいいだけのようですね。
    ➡️これはこの通り。ただし、回転させるなどして、動作確認が必要。

(参考) A Day In The Swift 1.2 | David Steuber dot Com
(参考) ViewController.swift – GitHub

Categories: Swift, 技術