#iphone #objective-c #metadata #exif
#iPhone #objective-c #метаданные #exif
Вопрос:
Я использовал теги Exif для хранения некоторых данных в файлах jpeg следующим образом:
CGImageSourceRef source = CGImageSourceCreateWithURL(baseURL, NULL);
NSDictionary *metadata = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSMutableDictionary *metadataAsMutable = [[metadata mutableCopy]autorelease];
NSMutableDictionary *EXIFDictionary = [[[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy]autorelease];
[EXIFDictionary setObject:[NSString stringWithFormat:@"%d",tag] forKey:(NSString *)kCGImagePropertyExifUserComment];
Теперь я хотел бы использовать пользовательский маркер приложения (APP3 в 0xFFE3) вместо маркера Exif.
(См.http://www.ozhiker.com/electronics/pjmt/jpeg_info/app_segments.html )
Может ли кто-нибудь указать мне правильное направление.
PS: Для этого приложения я использую iPad со взломанным джейлом.
Ответ №1:
Хорошо, похоже, для этого нам нужно использовать способ обработки файлов. Вот что я сделал, хотя, возможно, есть лучший способ сделать это.
Создайте дескриптор файла:
NSString *filePath = currentImageObject.myFilePath;
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
if(!fileHandle){
return;
}
[fileHandle seekToEndOfFile];
unsigned long long eofOffset = [fileHandle offsetInFile];
Затем повторяйте содержимое файла, пока не найдете нужный тег:
BOOL markerFound = NO;
BOOL dqtFound = NO;
while ((!markerFound) amp;amp; (!dqtFound) amp;amp; ([fileHandle offsetInFile] < eofOffset)) {
currentOffset = 1;
[fileHandle seekToFileOffset:currentOffset];
NSData *markerData = [fileHandle readDataOfLength:1];
currentOffset = 1;
NSInteger markerValue = (unsigned char)*(unsigned char *)[markerData bytes];
if (0xe0 == markerValue) {
currentOffset = 14;
[fileHandle seekToFileOffset:currentOffset];
NSData *xThumbnailData = [fileHandle readDataOfLength:1];
currentOffset = 1;
NSData *yThumbnailData = [fileHandle readDataOfLength:1];
currentOffset = 1;
NSInteger xThumbnail = (unsigned char)*(unsigned char *)[xThumbnailData bytes];
NSInteger yThumbnail = (unsigned char)*(unsigned char *)[yThumbnailData bytes];
NSInteger thumbnailSize = 3 * xThumbnail * yThumbnail;
currentOffset = thumbnailSize;
[fileHandle seekToFileOffset:currentOffset];
} else if (0xe3 == markerValue) {
markerFound = YES;
break;
} else if (0xdb == markerValue) {
dqtFound = YES;
break;
} else {
NSData *lengthData = [fileHandle readDataOfLength:2];
currentOffset = 2;
NSInteger length = (unsigned short)*(unsigned short *)[lengthData bytes];
length = NSSwapBigShortToHost(length);
length -= 2;
currentOffset = length;
[fileHandle seekToFileOffset:currentOffset];
}
}
Это дает вам смещение к маркеру APP3, если вам нужно добавить свой собственный маркер app3, вы можете использовать аналогичный подход.