iOS: доступ к метаданным JPEG в Marker APP3

#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, вы можете использовать аналогичный подход.