2012-09-18 10 views
11

Ich möchte Bildmetadaten mit ios anzeigen. Metadaten wie Blende, Shuttergeschwindigkeit, Belichtungskorrektur, ISO, Objektivbrennweite, etc. Also bitte helfen Sie mir, wenn jemand Idee hat.So erhalten Sie Bildmetadaten in ios

+0

was meinen Sie mit Bildmetadaten (Name, Größe und einige andere)? Bitte ausführlicher ... –

Antwort

26
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef) aUrl, NULL); 
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef) theData, NULL); 
NSDictionary* metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL); 

Überprüfen Sie den Wörterbuch Inhalt here.

+0

Danke Jonas Schnelli. Es hilft mir sehr. Danke Kumpel. –

+4

Natürlich sollten Sie erwähnen, dass Sie #import zu Ihrer Kopfzeile hinzufügen müssen, um die Klasse zu verwenden ... –

+1

Wenn Sie ARC verwenden, teilen Sie es so, um zu vermeiden Speicherlecks 'CFDictionaryRef dictRef = CGImageSourceCopyPropertiesAtIndex (source, 0, NULL); NSDictionary * Metadaten = (__bridge NSDictionary *) dictRef; CFrelease (Quelle); CFRelease (dictRef); ' –

4

Hier ist der Code, Meta-Daten von einem Bildpfad zu erhalten:

NSData *imagedata = [NSData dataWithContentsOfFile:imagePath]; 
CGImageSourceRef source = CGImageSourceCreateWithData((CFMutableDataRef)imagedata, NULL); 
NSDictionary *metadata = [(NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL)autorelease]; 

Oder, wenn swift 4.0 mit:

var imagedata = Data(contentsOfFile: imagePath) 
var source: CGImageSourceRef = CGImageSourceCreateWithData((imagedata as? CFMutableDataRef), nil) 
var metadata = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [AnyHashable: Any] 
+0

wie in swift3 oder swift4 zu tun? –

+1

var imagedata = Daten (contentsOfFile: imagePath) var Quelle: CGImageSourceRef = CGImageSourceCreateWithData ((Bilddaten als? CFMutableDataRef), null) var metadata = CGImageSourceCopyPropertiesAtIndex (source, 0, nil) als? [AnyHasable: Any] –

+0

hoffe es hilft dir –

-1

Sie müssen Vermögenswerte Bibliothek lesen EXIF-Metadaten von Bild verwenden .

#import <AssetsLibrary/AssetsLibrary.h> 

Und dann folgenden Code hinzu:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    __block NSMutableDictionary *imageMetadata = nil; 
    [library assetForURL:assetURL 
      resultBlock:^(ALAsset *asset) { 
       NSDictionary *metadata = asset.defaultRepresentation.metadata; 
       imageMetadata = [[NSMutableDictionary alloc] initWithDictionary:metadata]; 
       NSLog(@"%@",imageMetadata.description); 
      } 
      failureBlock:^(NSError *error) { 
      }]; 
} 

Hope this helfen

+0

Funktioniert nicht, AssetURL ist immer Null – malex

0

Hier ist, was ich bin mit der Bildgröße zu erhalten:

+ (CGSize) sizeOfImage:(NSString *) fileName withPath: (NSURL *) fullDirectoryPath; 
{ 
    NSURL *imageNameWithPath = [NSURL URLWithString:fileName relativeToURL:fullDirectoryPath]; 

    CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef) imageNameWithPath, NULL); 
    if (!source) return CGSizeZero; 

    CFDictionaryRef dictRef = CGImageSourceCopyPropertiesAtIndex(source,0,NULL); 
    NSDictionary* metadata = (__bridge NSDictionary *)dictRef; 
    NSLog(@"metadata= %@", metadata); 
    CGSize result = CGSizeZero; 
    CGFloat width = [metadata[@"PixelWidth"] floatValue]; 
    CGFloat height = [metadata[@"PixelHeight"] floatValue]; 
    NSLog(@"width= %f, height= %f", width, height); 

    // The orientation in the metadata does *not* map to UIImageOrientation. Rather, see: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGImageProperties_Reference/index.html#//apple_ref/doc/constant_group/Individual_Image_Properties 
    // This idea of orientation seems a little odd to me, but it seems it translates to even numbers need to be switched in width/height, odd numbers do not. 
    NSUInteger orientation = [metadata[@"Orientation"] integerValue]; 

    switch (orientation) { 
     // Comments give "Location of the origin of the image" 
     case 1: // Top, left 
     case 3: // Bottom, right 
     case 5: // Left, top 
     case 7: // Right, bottom 
      result = CGSizeMake(width, height); 
      break; 

     case 2: // Top, right 
     case 4: // Bottom, left 
     case 6: // Right, top 
     case 8: // Left, bottom 
      result = CGSizeMake(height, width); 
      break; 

     default: 
      NSAssert(NO, @"Should not get to here!"); 
      break; 
    } 

    CFRelease(source); 
    NSLog(@"size: %@, orientation: %d", NSStringFromCGSize(result), orientation); 

    return result; 
} 

/* Example meta data: 
    ColorModel = RGB; 
    Depth = 8; 
    Orientation = 6; 
    PixelHeight = 1936; 
    PixelWidth = 2592; 
    "{Exif}" =  { 
     ColorSpace = 1; 
     PixelXDimension = 2592; 
     PixelYDimension = 1936; 
    }; 
    "{JFIF}" =  { 
     DensityUnit = 0; 
     JFIFVersion =   (
           1, 
           1 
           ); 
     XDensity = 1; 
     YDensity = 1; 
    }; 
    "{TIFF}" =  { 
     Orientation = 6; 
    }; 
} 
*/ 
1
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 

    if(referenceURL) { 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) { 
     ALAssetRepresentation *rep = [asset defaultRepresentation]; 
     NSDictionary *metadata = rep.metadata; 
     NSLog(@"image data %@", metadata); 


    } failureBlock:^(NSError *error) { 
     // error handling 
    }]; 
} 
+0

Es ist besser, einige Erklärungen in Ihrer Antwort zu geben. – Envil

0

swift 4

static func imageDataProperties(_ imageData: Data) -> NSDictionary? { 
    if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil) 
    { 
     if let dictionary = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) { 
     return dictionary 
     } 
    } 
    return nil 
    } 
0

Beantworten meiner eigenen Frage. Der Speicher-effektive und schnelle Art und Weise einen GPS-Metadaten zu erhalten, ist

let options = [kCGImageSourceShouldCache as String: kCFBooleanFalse] 
if let data = NSData(contentsOfURL: url), imgSrc = CGImageSourceCreateWithData(data, options) { 
    let metadata = CGImageSourceCopyPropertiesAtIndex(imgSrc, 0, options) as Dictionary 
    let gpsData = metadata[kCGImagePropertyGPSDictionary] as? [String : AnyObject] 
} 

Die zweite Option ist

if let img = CIImage(contentsOfURL: url), metadata = img.properties(), 
gpsData = metadata[kCGImagePropertyGPSDictionary] as? [String : AnyObject] { … } 

sieht es in Swift schöner aber mehr Speicher verwendet (getestet über Profiler).

1

auf iOS 11 Rahmen

Ziel mit Fotos aktualisiert - C:

#import <Photos/Photos.h> 

- (void)imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { 

    PHAsset* asset = info[UIImagePickerControllerPHAsset]; 

    [asset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
     CIImage *fullImage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL]; 

     NSLog(@"%@", fullImage.properties.description); 
    }]; 

    [imagePicker dismissViewControllerAnimated:YES completion:nil]; 
} 

Sie auch die Genehmigung der Photothek Usage (NSPhotoLibraryUsageDescription) benötigen und dann den folgenden Code hinzufügen können, hat zu sehen laden oder anzeigen wurde angezeigt

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { 
    switch (status) { 
     case PHAuthorizationStatusAuthorized: 
      NSLog(@"PHAuthorizationStatusAuthorized"); 
      break; 
     case PHAuthorizationStatusDenied: 
      NSLog(@"PHAuthorizationStatusDenied"); 
      break; 
     case PHAuthorizationStatusNotDetermined: 
      NSLog(@"PHAuthorizationStatusNotDetermined"); 
      break; 
     case PHAuthorizationStatusRestricted: 
      NSLog(@"PHAuthorizationStatusRestricted"); 
      break; 
    } 
}]; 
Verwandte Themen