问题描述
我目前正在开发一款iPad应用程序,用户可以在文本字段中输入照片文件名(作为现场笔记的一部分),之后他们会将照片导入到iPad的照片库中。应用程序将使用ALAssetsLibrary访问库并枚举照片,查找具有在字段注释中输入的文件名的照片。这将是拍摄它的相机给照片的文件名。例如DSC_0019.JPG。
I'm currently developing an iPad app where a user will enter a photo filename in a text field (as part of field notes), then later they will import their photos to the iPad's photo library. The app will access the library using ALAssetsLibrary and enumerate over the photos, looking for ones with the filename they entered in their field notes. This would be the filename given to the photo by the camera that took it. For example "DSC_0019.JPG".
这不可能吗?
我注意到如果我将照片从相机导入iPad,然后打开在我的Mac上的iPhoto和iPad作为相机,我可以获取信息在iPad上保存的图像,并查看我正在寻找的原始文件名。但是,这不包含在iPad上的元数据中。
I noticed that if I import photos from my camera to iPad, then open iPhoto on my Mac and look at the iPad as a camera, I can "get info" on the images held on the iPad and see the original filename I'm looking for. However this is not contained in the metadata on the iPad.
任何帮助将不胜感激。
Any help would be greatly appreciated.
这是我的代码:
(在使用CFDictionary时,除了Exif之外几乎所有东西都是null没有我想要的钥匙)
(In working with the CFDictionary, pretty much everything is null except the Exif keys which don't have what i'm looking for)
- (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
推荐答案
我能够得到一个图像的原始文件名,如下所示:
I was able to get an image's original filename like this:
NSString* originalFileName = [[asset defaultRepresentation] filename];
这篇关于如何在iOS中获取照片的原始文件名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!