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

| 我一直在以以下方式使用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。     
已邀请:
好的,看来我们必须通过文件处理程序进行操作。这是我所做的,尽管可能有更好的方法。 创建一个文件句柄:
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标记。     

要回复问题请先登录注册