2016-10-27 18 views
1

状況: アップロードの場合。画像がTheta SやGear 360のようなカメラから360°の画像である場合は、クライアント側のチェックが必要です。 これは、XMPメタデータを確認することでかなり簡単に行うことができます。NSDataからXMPメタデータを読み取る

ImageIOはXMPメタデータを無視するようですが、以下の例を実行すると、ImageIOが返すデータにはXMPエントリがありません。

スウィフト3:

import ImageIO 

let url = URL(fileURLWithPath: filePath) 
let imageData:Data = try! Data(contentsOf: url) 

if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil), 
    let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [AnyHashable:Any] 
{ 
    print(imageProperties) // no xmp metadata? 
} 

は、私は、画像のNSDataからXMP-XMLをsubstractできる方法はありますか?

答えて

0

だけXMPメタデータ内の1つの特定の値をチェックし、代わりに列挙するならば、あなたも、このようにそれを検索することができます。

guard let source = CGImageSourceCreateWithData(self as NSData, nil) else { return } 
guard let metadata = CGImageSourceCopyMetadataAtIndex(source, 0, nil) else { return } 
let tag = CGImageMetadataCopyTagWithPath(metadata, nil, "GPano:ProjectionType" as NSString) 
2

CGImageSourceCopyMetadataAtIndexでこの情報にアクセスできます。

ラフコード例:

スウィフト3:

if let imageSource = CGImageSourceCreateWithData(nsData as CFData, nil), 
    let imageProperties = CGImageSourceCopyMetadataAtIndex(imageSource, 0, nil) { 
    var result:String = "" 
    CGImageMetadataEnumerateTagsUsingBlock(imageProperties, nil, nil, { (key, tag) -> Bool in 
     let tagString:NSString = CGImageMetadataTagCopyName(tag) as! NSString 
     if tagString == "ProjectionType" { 
      result = CGImageMetadataTagCopyValue(tag) as! NSString 
      return false 
     } 
     return true 
    }) 

    print(result) //equirectangular 
} 
関連する問題