映像ファイルのフレーム画像を
抜き出す
画像を取り出して NSImageView に表示したり、ファイルに保存する方法も、ちょっとメモっておく。
まずは、AVAsset オブジェクトから、AVAssetImageGenerator の assetImageGeneratorWithAsset(asset) を使って、AVAssetImageGenerator オブジェクトをつくる。次に、copyCGImageAtTime(time,actualTime:actualTime,error:error) でイメージとして取り出す。このときの返り値は CGImageRef オブジェクト。
imageGenerator = AVAssetImageGenerator.assetImageGeneratorWithAsset(asset)
imageRef = imageGenerator.copyCGImageAtTime(currentTime,actualTime:nil,error:nil)
ここでできた CGImageRef を表示させたりするのに、NSBitmapImageRep の initWithCGImage で NSBitmapImageRep オブジェクトに変換してから、representationUsingType(type,properties:properties) で、PNG (NSPNGFileType) もしくは JPEG (NSJPEGFileType) の image data に変換する。jpeg の場合は、properties で圧縮度合い (NSImageCompressionFactor) を 0 ~ 1.0 で指定する。返り値は NSData オブジェクト。
bitmapRep = NSBitmapImageRep.alloc.initWithCGImage(imageRef)
imageData = bitmapRep.representationUsingType(NSPNGFileType,properties:nil)
imageData = bitmapRep.representationUsingType(NSJPEGFileType,properties:{NSImageCompressionFactor => 0.8})
これを、NSImage の initWithData で NSImage オブジェクトにして、NSImageView に setImage で表示させたり、データのまま、writeToFile(filename,atomically:bool) でファイルに保存する。この際は、指定した type によって、ファイル名で .png もしくは .jpg を指定することを忘れないように。
image = NSImage.alloc.initWithData(imageData)
imageView.setImage(image)
imageData.writeToFile(filename,atomically:true)