我一直在使用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。
答案 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标记,可以使用类似的方法。