2014-09-29 60 views
2

当我在IOS8的标准Photos应用中使用过滤器时,我无法获得完整的元数据。 我尝试两种方法获取元数据:IOS8。照片应用程序错误

[manager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
    CIImage *ciimage = [CIImage imageWithData:imageData]; 
    NSMutableDictionary *exif = [NSMutableDictionary dictionary]; 
    [exif addEntriesFromDictionary:ciimage.properties]; 
}]; 

[asset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
    CIImage *cimage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL]; 
    NSMutableDictionary *exif = [NSMutableDictionary dictionary]; 
    [exif addEntriesFromDictionary:cimage.properties]; 
}]; 

我还没有发现任何提及到应用程序的照片。我得到这样的结果总是:

{ 
ColorModel = RGB; 
DPIHeight = 72; 
DPIWidth = 72; 
Depth = 8; 
Orientation = 1; 
PixelHeight = 2592; 
PixelWidth = 1936; 
"{Exif}" =  { 
    ColorSpace = 1; 
    PixelXDimension = 1936; 
    PixelYDimension = 2592; 
}; 
"{JFIF}" =  { 
    DensityUnit = 1; 
    JFIFVersion =   (
     1, 
     0, 
     1 
    ); 
    XDensity = 72; 
    YDensity = 72; 
}; 
"{TIFF}" =  { 
    Orientation = 1; 
}; 

有没有人找到解决方案如何获取在照片中编辑过的图像的元数据?

我想看到的元数据是这样的:

link

+0

你在找什么样的元数据信息Photos.framework的一个错误,特别是? – rickster 2014-09-29 13:49:31

回答

2

我发现如何获取原始元数据:

PHImageRequestOptions *options = [PHImageRequestOptions new]; 
options.networkAccessAllowed = YES; 
options.synchronous = YES; 
options.version = PHImageRequestOptionsVersionOriginal; 

[manager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
    CIImage *ciimage = [CIImage imageWithData:imageData]; 
    NSMutableDictionary *exif = [NSMutableDictionary dictionary]; 
    [exif addEntriesFromDictionary:ciimage.properties]; 
}]; 
0

我试图完全相同的代码以及每个其它替代机制来检索在Xcode IOS 8模拟器和从照片应用程序中的原始图像数据只有在模拟器下的照片应用程序中出现任何图像的东西实际上都是空的EXIF - 与原始问题中所示的几乎相同。

下面是问题:这是孤立的只有模拟器?在模拟器中通过拖放将图像添加到Photo应用程序时是否存在问题?

PHImageManager.defaultManager().requestImageForAsset(assetImage as PHAsset, targetSize:PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: { (initialResult, _) in 
     self.photoImageView.image = initialResult as UIImage 
     println("WTF") 
     println(initialResult) 
    }) 

PHImageManager.defaultManager().requestImageDataForAsset(assetImage, options: imageRequestOptions, resultHandler: { (imageData: NSData!, dataUti: String!, orientation: UIImageOrientation, _) in 
     println("requestImageDataForAsset") 
     println(imageData) 
     let imageTest = CIImage(data: imageData) 
     println(imageTest) 
     let imageMeta = imageTest.properties() 
     println(imageMeta) 
    }) 

 assetImage.requestContentEditingInputWithOptions(initialRequestOptions, completionHandler: { (input: PHContentEditingInput!, _) -> Void in 
     //Get full image 
     let url = input.fullSizeImageURL 
     let orientation = input.fullSizeImageOrientation 
     var inputImage = CIImage(contentsOfURL: url) 
     inputImage = inputImage.imageByApplyingOrientation(orientation) 

     for (key, value) in inputImage.properties() { 
      println("key: \(key)") 
      println("value: \(value)") 
     } 
    }) 

都产生在Xcode IOS模拟器相同的结果为8.0/8.1。

您的代码是否适用于模拟器?这似乎与我提供的第二个样本没有相同。

0

这太奇怪了。

NSString *albumName = @"albumName" 
PHFetchOptions *fetchOption = [[PHFetchOptions alloc]init]; 
fetchOption.predicate = [NSPredicate predicateWithFormat:@"title == %@",albumName]; 

PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:fetchOption]; 

PHFetchOptions *fetchOption = [[PHFetchOptions alloc]init]; 
fetchOption.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; 
fetchOption.predicate = [NSPredicate predicateWithFormat:@"mediaType == 1"]; 
fetchOption.wantsIncrementalChangeDetails = YES; 
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:[result firstObject] options:nil]; 

//MetaData here is not complicated as you get 
[result[0] requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
    CIImage *image = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL]; 
    NSDictionary *metaData = [[NSDictionary alloc]initWithDictionary:image.properties]; 
    NSLog(@"metadata: %@", image.properties.description); 
}]; 

使用上面的代码,metaData并不复杂。 然后..

NSString *type = [NSString stringWithFormat:@"mediaType == 1 && (pixelWidth != %f && pixelHeight != %f)",SCREEN_WIDTH*scale,SCREEN_HEIGHT*scale]; 

allPhotosfetchOption.predicate = [NSPredicate predicateWithFormat:type]; 
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosfetchOption]; 

[result[0] requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
    CIImage *image = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL]; 
    NSDictionary *metaData = [[NSDictionary alloc]initWithDictionary:image.properties]; 
    NSLog(@"metadata: %@", image.properties.description); 
}]; 

我在这里可以得到充分的元数据...我认为这是