我目前正在开发一款iPad应用,用户可以在文本字段中输入照片文件名(作为现场笔记的一部分),之后他们会将照片导入iPad的照片库。应用程序将使用ALAssetsLibrary访问库并枚举照片,查找具有在字段注释中输入的文件名的照片。这将是拍摄它的相机给照片的文件名。例如“DSC_0019.JPG”。
这不可能吗?
我注意到如果我将相机中的照片导入iPad,然后在我的Mac上打开iPhoto并将iPad作为相机查看,我可以“获取有关iPad上保存的图像的信息”并查看原始文件名我我正在寻找。但是,这不包含在iPad上的元数据中。
非常感谢任何帮助。
这是我的代码:
(在使用CFDictionary时,几乎所有东西都是null,除了没有我想要的Exif键)
- (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 :(得分:21)
我能够像这样得到图像的原始文件名:
NSString* originalFileName = [[asset defaultRepresentation] filename];
答案 1 :(得分:0)
从ALAsset中提取URL,如下所示:assets-library://asset/asset.JPG?id = 1000000001& ext = JPG
如果您需要不同的文件名,请制作内部 - 外部范例:
#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
请注意,您不需要文件名来读取ALAsset的内容。使用ALAsset.defaultRepresentation.getBytes方法。