iOS:在Marker APP3上访问JPEG元数据

时间:2011-05-26 06:07:36

标签: iphone objective-c metadata 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];

现在,我想使用自定义应用程序标记(在0xFFE3处的APP3)而不是Exif Marker。

(参考 - http://www.ozhiker.com/electronics/pjmt/jpeg_info/app_segments.html

有人能指出我正确的方向。

PS:我正在为这个应用程序使用越狱的iPad。

1 个答案:

答案 0 :(得分:0)

好的,似乎我们必须通过文件处理程序方式。这就是我所做的,尽管可能有更好的方法来做到这一点。

创建文件句柄:

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) && (!dqtFound) && ([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标记,可以使用类似的方法。