ver una tienen tamaño que peso nombre metadatos las imagen fotos foto dimensiones como ios iphone uiimageview alassetslibrary ios8

ios - una - tamaño de fotos de iphone



iOS 8 Fotos framework. Acceda a los metadatos de la foto (5)

La mejor solución que encontré y funcionó bien para mí es:

[[PHImageManager defaultManager] requestImageDataForAsset:photoAsset options:reqOptions resultHandler: ^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { CIImage* ciImage = [CIImage imageWithData:imageData]; DLog(@"Metadata : %@", ciImage.properties); }];

Estoy buscando reemplazar ALAssetsLibrary con Photos Framework en mi aplicación. Puedo recuperar fotos, colecciones y fuentes de recursos sin problemas (incluso escribirlas de nuevo), pero no veo ningún lugar para acceder a los metadatos de las fotos (los diccionarios como {Exif}, {TIFF}, {GPS}, etc ...). ALAssetsLibrary tiene una manera. UIImagePickerController tiene una manera. Las fotos deben tener una forma también.

Veo que PHAsset tiene una propiedad de ubicación que servirá para el diccionario GPS, pero estoy buscando acceder a todos los metadatos que incluyen, caras, orientación, exposición, ISO y mucho más.

Actualmente apple está en beta 2. ¿Quizás haya más API por venir?

ACTUALIZAR------------------------------------------------- -----------------

No hay una forma oficial de hacerlo utilizando solo las API de fotos. Sin embargo, puede leer los metadatos después de descargar los datos de la imagen. Hay un par de métodos para hacer esto usando PHImageManager o PHContentEditingInput. El método PHContentEditingInput requiere menos código y no requiere que importe ImageIO. Lo envolví en una categoría PHAsset


Pensé compartir algún código para leer los metadatos usando el marco de ImageIO junto con Photos Framework. Debe solicitar los datos de imagen con un PHCachingImageManager.

@property (strong) PHCachingImageManager *imageManager;

Solicite la imagen y utilícela para crear un diccionario de metadatos

-(void)metadataReader{ PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:self.myAssetCollection options:nil]; [result enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndex:myIndex] options:NSEnumerationConcurrent usingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { [self.imageManager requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { NSDictionary *metadata = [self metadataFromImageData:imageData]; NSLog(@"Metadata: %@", metadata.description); NSDictionary *gpsDictionary = metadata[(NSString*)kCGImagePropertyGPSDictionary]; if(gpsDictionary){ NSLog(@"GPS: %@", gpsDictionary.description); } NSDictionary *exifDictionary = metadata[(NSString*)kCGImagePropertyExifDictionary]; if(exifDictionary){ NSLog(@"EXIF: %@", exifDictionary.description); } UIImage *image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale]; // assign image where ever you need... }]; }]; }

Convierta NSData en metadata

-(NSDictionary*)metadataFromImageData:(NSData*)imageData{ CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)(imageData), NULL); if (imageSource) { NSDictionary *options = @{(NSString *)kCGImageSourceShouldCache : [NSNumber numberWithBool:NO]}; CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (__bridge CFDictionaryRef)options); if (imageProperties) { NSDictionary *metadata = (__bridge NSDictionary *)imageProperties; CFRelease(imageProperties); CFRelease(imageSource); return metadata; } CFRelease(imageSource); } NSLog(@"Can''t read metadata"); return nil; }

Esto tiene la ventaja de captar la imagen, por lo que no es tan rápido como enumerar tus activos o colecciones, pero al menos es algo.


PhotoKit limita el acceso a los metadatos a las propiedades de PHAsset (location, creationDate, favourite, hidden, modificatonDate, pixelWidth, pixelHeight ...). La razón (sospecho) es que debido a la introducción de iCloud PhotoLibrary las imágenes pueden no estar en el dispositivo. Por lo tanto, los metadatos completos no están disponibles. La única forma de obtener los metadatos EXIF ​​/ IPTC completos es primero descargar la imagen original (si no está disponible) de iCloud y luego usar ImageIO para extraer sus metadatos.


Puede modificar el PHAsset (por ejemplo, agregando metadatos de ubicación) utilizando Photos Framework y el método UIImagePickerControllerDelegate. Sin gastos generales de bibliotecas de terceros, no se crearon fotos duplicadas. Funciona para iOS 8.0+

En el método de delegado didFinishPickingMediaWithInfo, llame a UIImageWriteToSavedPhotosAlbum para guardar primero la imagen. Esto también creará el PHAsset cuyos datos de GPS EXIF ​​modificaremos:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { if let myImage = info[UIImagePickerControllerOriginalImage] as? UIImage { UIImageWriteToSavedPhotosAlbum(myImage, self, Selector("image:didFinishSavingWithError:contextInfo:"), nil) } }

La función del selector de finalización se ejecutará después de que el guardado finalice o falle con un error. En la devolución de llamada, busque el nuevo PHAsset. Luego, cree PHAssetChangeRequest para modificar los metadatos de ubicación.

func image(image: UIImage, didFinishSavingWithError: NSErrorPointer, contextInfo:UnsafePointer<Void>) { if (didFinishSavingWithError != nil) { print("Error saving photo: /(didFinishSavingWithError)") } else { print("Successfully saved photo, will make request to update asset metadata") // fetch the most recent image asset: let fetchOptions = PHFetchOptions() fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) // get the asset we want to modify from results: let lastImageAsset = fetchResult.lastObject as! PHAsset // create CLLocation from lat/long coords: // (could fetch from LocationManager if needed) let coordinate = CLLocationCoordinate2DMake(myLatitude, myLongitude) let nowDate = NSDate() // I add some defaults for time/altitude/accuracies: let myLocation = CLLocation(coordinate: coordinate, altitude: 0.0, horizontalAccuracy: 1.0, verticalAccuracy: 1.0, timestamp: nowDate) // make change request: PHPhotoLibrary.sharedPhotoLibrary().performChanges({ // modify existing asset: let assetChangeRequest = PHAssetChangeRequest(forAsset: lastImageAsset) assetChangeRequest.location = myLocation }, completionHandler: { (success:Bool, error:NSError?) -> Void in if (success) { print("Succesfully saved metadata to asset") print("location metadata = /(myLocation)") } else { print("Failed to save metadata to asset with error: /(error!)") }


Si solicita una entrada de edición de contenido, puede obtener la imagen completa como un CIImage , y CIImage tiene una propiedad titulada properties que es un diccionario que contiene los metadatos de la imagen.

Ejemplo de código Swift:

let options = PHContentEditingInputRequestOptions() options.networkAccessAllowed = true //download asset metadata from iCloud if needed asset.requestContentEditingInputWithOptions(options) { (contentEditingInput: PHContentEditingInput?, _) -> Void in let fullImage = CIImage(contentsOfURL: contentEditingInput!.fullSizeImageURL) print(fullImage.properties) }

Ejemplo de código Objective-C:

PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init]; options.networkAccessAllowed = YES; //download asset metadata from iCloud if needed [asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { CIImage *fullImage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL]; NSLog(@"%@", fullImage.properties.description); }];

Obtendrá los diccionarios {Exif}, {TIFF}, {GPS}, etc. deseados.