2012-09-18 13 views
11

Chcę wyświetlić metadane obrazu za pomocą ios. Dane metadane, takie jak Przysłona, Shutterspeed, Kompensacja ekspozycji, ISO, Ogniskowa obiektywu itp. Proszę, pomóżcie mi, jeśli ktoś ma pomysł.Jak uzyskać metadane obrazu w ios

+0

co masz na myśli przez metadane obrazu (nazwa, rozmiar i kilka innych)? Proszę opracować ... –

Odpowiedz

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

Sprawdź zawartość słownika here.

+0

Dzięki Jonas Schnelli. Bardzo mi to pomaga. Dzięki stary. –

+4

Powinieneś oczywiście wspomnieć, że będziesz musiał dodać #import do nagłówka, aby móc korzystać z klasy ... –

+1

Jeśli używasz ARC, podziel go tak, aby uniknąć wycieki pamięci: 'CFDictionaryRef dictRef = CGImageSourceCopyPropertiesAtIndex (source, 0, NULL); NSDictionary * metadata = (__bridge NSDictionary *) dictRef; > CFRelease (źródło); CFRelease (dictRef); ' –

4

Oto kod, aby uzyskać meta danych ze ścieżki obrazu:

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

Lub, w przypadku korzystania z szybkich 4.0:

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

jak to zrobić w swift3 lub swift4? –

+1

var imagedata = Dane (contentsOfFile: imagePath) źródło var: CGImageSourceRef = CGImageSourceCreateWithData ((imagedata jako? CFMutableDataRef), zero) var metadata = CGImageSourceCopyPropertiesAtIndex (source, 0, nil) as? [AnyHashable: Any] –

+0

mam nadzieję, że ci to pomoże –

-1

Trzeba korzystać z zasobów bibliotecznych do zapoznania exif metadane obrazu .

#import <AssetsLibrary/AssetsLibrary.h> 

a następnie dodaj następujący kod:

- (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) { 
      }]; 
} 

nadzieję, że pomoże

+0

Nie działa, assetURL jest zawsze zerowy – malex

0

Oto co używam, aby uzyskać rozmiar obrazu:

+ (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

Lepiej podać kilka wyjaśnień w swojej odpowiedzi. – 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

Odpowiadając na moje własne pytanie. Pamięć-skuteczny i szybki sposób uzyskać metadane GPS jest

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] 
} 

Druga opcja jest

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

wygląda ładniej w Swift ale zużywa więcej pamięci (sprawdzony przez Profiler).

1

zaktualizowane do iOS 11 ze zdjęciami ramach

Objective - 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]; 
} 

Trzeba również zgodę Photo Library Wykorzystanie (NSPhotoLibraryUsageDescription), a następnie można dodać następujący kod do wyświetlania zrobił załadowanie lub wyświetlenie pojawił się

[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; 
    } 
}]; 
Powiązane problemy