任何一张全景照片按Facebook说明Editing 360 Photos & Injecting Metadata添加全景标识
ProjectionType="equirectangular"
再由Facebook网页分享,可自动识别为全景照片,并使用正确的显示模式,即全景模式。
ImageIO读取已添加全景标识的照片元数据,得到如下信息。
exif:PixelYDimension = 1280
iio:hasXMP = True
GPano:ProjectionType = equirectangular
exif:PixelXDimension = 2560
exif:ColorSpace = 1
而使用Facebook iOS SDK上传此照片,发现并不会识别为全景照片,而是使用平面显示为展开图。将此照片下载回本地,再读取其元数据,发现已无全景标识且图像体积降为原图一半,如下所示。
photoshop:TransmissionReference = 4um-_c4_2nXlBJo6UsZk
photoshop:Instructions = FBMD01000a9a0d0000db850000f0da000084e100008de800004b0a01006d98010064be01005cda01009ff601007f4b0300
iio:hasIIM = True
原因分析,可能是由于我们使用UIImage读取照片,而UIImage并不读取照片的元数据,导致这些信息丢失,从而令Facebook SDK出现误判。SDK调用示例代码如下。
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
photo.userGenerated = YES;
photo.image = [UIImage imageWithContentsOfFile:url];
photo.caption = caption;
FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
content.photos = @[photo];
[FBSDKShareAPI shareWithContent:content delegate:self];
由于我们的Facebook账号被锁定,无法进一步查找原因,此问题暂且搁置。
另外,ImageIO不支持写全景标识到图像中。ImageIO读取全景标识等元数据示例代码如下所示。
- (void)readXMPForImageWithURL:(NSURL *)url {
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
CGImageMetadataRef metadataRef = CGImageSourceCopyMetadataAtIndex(imageSourceRef, 0, NULL);
if (NULL == metadataRef) {
return;
}
NSLog(@"metadata = \n%@", metadataRef);
}
网友评论