2011-08-24 18 views
14

Obecnie tworzę aplikację na iPada, w której użytkownik wprowadzi nazwę pliku ze zdjęciem w polu tekstowym (w ramach notatek terenowych), a następnie zaimportuje swoje zdjęcia do biblioteki zdjęć iPada. Aplikacja uzyska dostęp do biblioteki za pomocą ALAssetsLibrary i wyliczy na zdjęciach, szukając tych z nazwą pliku, którą wpisali w swoich notatkach terenowych. To byłaby nazwa pliku nadana zdjęciu przez aparat, który go wziął. Na przykład "DSC_0019.JPG".Jak uzyskać oryginalną nazwę pliku zdjęcia w iOS?

Czy to nie jest możliwe?

Zauważyłem, że jeśli importuję zdjęcia z mojego aparatu na iPada, to otwórz iPhoto na moim Macu i spójrz na iPada jako aparat fotograficzny, mogę "uzyskać informacje" o obrazach przechowywanych na iPadzie i zobaczyć oryginalną nazwę pliku Szukam. Jednak nie jest to zawarte w metadanych na iPadzie.

Każda pomoc zostanie bardzo doceniona.

Oto mój kod:

(W pracy z CFDictionary, prawie wszystko jest null wyjątkiem klawiszy Exif które nie mają czego szukam)

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //start activity animation 
    [self.activity setHidden:NO]; 
    [self.activity startAnimating]; 

    //init our arrays 
    autoAssignedAssets = [[NSMutableArray alloc] init]; 
    unAssignedRecords = [[NSMutableArray alloc] init]; 
    unAssignedAssets = [[NSMutableArray alloc] init]; 

    //setup the library 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 



    //[ BLOCK ] => assetEnumerator 
    // 
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) { 

     if (result != nil) { 

      if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 


       //================================================================= 

       ALAssetRepresentation* representation = [result defaultRepresentation]; 

       // create a buffer to hold the data for the asset's image 
       uint8_t *buffer = (Byte*)malloc(representation.size);// copy the data from the asset into the buffer 
       NSUInteger length = [representation getBytes:buffer fromOffset: 0.0 length:representation.size error:nil]; 

       // convert the buffer into a NSData object, free the buffer after 
       NSData *adata = [[NSData alloc] initWithBytesNoCopy:buffer length:representation.size freeWhenDone:YES]; 

       // setup a dictionary with a UTI hint. The UTI hint identifies the type of image we are dealing with (ie. a jpeg, png, or a possible RAW file) 
       // specify the source hint 
       NSDictionary* sourceOptionsDict = [NSDictionary dictionaryWithObjectsAndKeys: (id)[representation UTI] ,kCGImageSourceTypeIdentifierHint, nil]; 


       // create a CGImageSource with the NSData. A image source can contain x number of thumbnails and full images. 
       CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef) adata, (CFDictionaryRef) sourceOptionsDict); 

       [adata release]; 

       CFDictionaryRef imagePropertiesDictionary; 

       // get a copy of the image properties from the CGImageSourceRef 
       imagePropertiesDictionary = CGImageSourceCopyPropertiesAtIndex(sourceRef,0, NULL); 

       //NSString *imageFilename = (NSString*)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyCIFFImageFileName); 

       NSLog(@"%@", (NSDictionary *)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyExifDictionary)); 

       CFNumberRef imageWidth = (CFNumberRef)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyPixelWidth); 
       CFNumberRef imageHeight = (CFNumberRef)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyPixelHeight); 

       int w = 0; 
       int h = 0; 

       CFNumberGetValue(imageWidth, kCFNumberIntType, &w); 
       CFNumberGetValue(imageHeight, kCFNumberIntType, &h); 

       // cleanup memory 
       CFRelease(imagePropertiesDictionary); 
       CFRelease(sourceRef); 

       //NSLog(@"width: %d, height: %d", w, h); 
       //NSLog(@"%@", imageFilename); 



       //================================================================= 


       //NSDictionary *metadata = [[result defaultRepresentation] metadata]; 
       //NSLog(@"\n\nAsset Info: %@", result); 
       //NSLog(@"\n\n\n\nMetaData: %@", metadata); 
       [autoAssignedAssets addObject:result]; 

      }//end if photo 

     }//end if 

    }; //end assetEnumerator block 



    //[ BLOCK ] => assetGroupEnumerator 
    // 
    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { 

     if(group != nil) { 
      [group enumerateAssetsUsingBlock:assetEnumerator]; 
     }//end if 


     //now we're done, reload and stop animations 
     [self.tableView reloadData]; 
     [self.activity stopAnimating]; 
     [self.activity setHidden:YES]; 

    }; //end assetGroupEnumerator block 



    //[ BLOCK ] => failureBlock 
    // 
    void (^failureBlock)(NSError *) = ^(NSError *error) { 

     NSString *errorTitle = [error localizedDescription]; 
     NSString *errorMessage = [error localizedRecoverySuggestion]; 
     NSString *errorFailureDesc = [error localizedFailureReason]; 

     NSLog(@"Error: %@, Suggestion: %@, Failure desc: %@", errorTitle, errorMessage, errorFailureDesc); 

    }; //end failureBlock 




    //loop over all the albums and process the pictures with the blocks above 
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock: failureBlock]; 


}//end viewDidLoad 
+0

Spędziłem trochę czasu próbuje dowiedzieć się tę odpowiedź. Jedyne, co zrobiłem, było to pytanie - http://stackoverflow.com/questions/5048640/retrieving-a-filename-for-anasset - a także ten intrygujący samouczek dotyczący metadanych - http://sarofax.wordpress .com/2011/07/10/alasset-image-metadata /. Chciałbym móc pomóc dalej. Wbudowane aplikacje Apple oczywiście robią tam pewne tajne rzeczy wiewiórki. –

Odpowiedz

21

udało mi się dostać oryginalną nazwę pliku dla fotografowanego obrazu tak: (! ... naprawdę dla zabawy)

NSString* originalFileName = [[asset defaultRepresentation] filename]; 
+1

Obecnie zdaję sobie sprawę, że to nie daje oryginalnej nazwy pliku. Zwraca coś podobnego do IMG_0101.JPG, które akurat było podobne do plików, których używałem w tym czasie. – djschwartz

+2

Odkryłem, że jest to w rzeczywistości oryginalna nazwa pliku. Jeśli zaimportujesz zdjęcia do urządzenia, na czym mi zależało. Tak więc od mojego Nikona miałem DSC_0001.jpg, który przychodzi z tą metodą. – bwizzy

+3

Działa tylko w systemie iOS 5.x – Seunghoon

0

Wyodrębnij URL z ALAsset, wygląda następująco: id = 1000000001 & //asset/asset.JPG ext = JPG

Jeśli potrzebujesz różne nazwy plików, zrobić wewnętrzny-zewnętrzny paradygmat:: aktywa-biblioteka?

#import <Foundation/Foundation.h> 

@interface NSURL (NSURL_Asset) 
- (NSURL*) toExternalForm; 
- (NSURL*) fromExternalForm; 
- (NSString*) toExternalFilename;  

@end 

#import "NSURL+Asset.h" 
#import "URLParser.h" // from http://iphone.demay-fr.net/2010/04/parsing-url-parameters-in-a-nsstring/ 

static NSString *const EXTERNAL_TOKEN = @"/assetExternalForm/"; 
@implementation NSURL (NSURL_Asset) 

// assets-library://asset/asset.JPG/assetExternalForm/1000000001.JPG -> assets-library://asset/asset.JPG?id=1000000001&ext=JPG 
- (NSURL*) fromExternalForm { 
    if([self.scheme isEqualToString:@"assets-library"]) { 
     NSRange slash = [self.absoluteString rangeOfString:EXTERNAL_TOKEN options:NSBackwardsSearch]; 
     if(slash.location != NSNotFound) { 

      NSRange dot = [self.absoluteString rangeOfString:@"." options:NSBackwardsSearch]; 

      if(dot.location != NSNotFound) { 
       NSString* extention = [self.absoluteString substringFromIndex:(dot.location + dot.length)]; 
       NSString* identifier = [self.absoluteString substringWithRange:NSMakeRange(slash.location + slash.length, dot.location - (slash.location + slash.length))]; 
       return [NSURL URLWithString:[NSString stringWithFormat:@"%@?id=%@&ext=%@", [self.absoluteString substringToIndex:slash.location], identifier, extention]]; 
      } 
     } 
    } 
    return self; 
} 
// assets-library://asset/asset.JPG?id=1000000001&ext=JPG -> assets-library://asset/asset.JPG/assetExternalForm/1000000001.JPG 
- (NSURL*) toExternalForm { 
    if([self.scheme isEqualToString:@"assets-library"]) { 
     NSRange range = [self.absoluteString rangeOfString:@"?"]; 
     if(range.location != NSNotFound) { 
      URLParser *parser = [[[URLParser alloc] initWithURLString:self.absoluteString] autorelease]; 
      NSString* extention = [parser valueForVariable:@"ext"]; 
      NSString* identifier = [parser valueForVariable:@"id"]; 
      if(extention != NULL && identifier != NULL) { 
       return [NSURL URLWithString:[NSString stringWithFormat:@"%@%@%@.%@", [self.absoluteString substringToIndex:range.location], EXTERNAL_TOKEN, identifier, extention]]; 
      } 
     } 
    } 
    return self; 
} 
// assets-library://asset/asset.JPG?id=1000000001&ext=JPG -> 1000000001.JPG 
- (NSString*) toExternalFilename { 
    if([self.scheme isEqualToString:@"assets-library"]) { 
     NSRange range = [self.absoluteString rangeOfString:@"?"]; 
     if(range.location != NSNotFound) { 
      URLParser *parser = [[[URLParser alloc] initWithURLString:self.absoluteString] autorelease]; 
      NSString* extention = [parser valueForVariable:@"ext"]; 
      NSString* identifier = [parser valueForVariable:@"id"]; 

      if(extention != NULL && identifier != NULL) { 
       return [NSString stringWithFormat:@"%@.%@", identifier, extention]; 
      } 
     } 
    } 
    return NULL; 
} 
@end 

Pamiętaj, że nie potrzebujesz nazwy pliku, aby odczytać zawartość zestawu ALA. Użyj do tego metody ALAsset.defaultRepresentation.getBytes.

Powiązane problemy