美文网首页iOS技术文章iOS技术交流收藏iOS进阶
ImageIO读取照片的全景标识与Facebook SDK上传全

ImageIO读取照片的全景标识与Facebook SDK上传全

作者: 熊皮皮 | 来源:发表于2016-11-10 19:29 被阅读394次

任何一张全景照片按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);
}

相关文章

网友评论

  • 603010f3888b:为什么我跟你一样 但是不行 能不能提供一个demo给我 谢谢你了

本文标题:ImageIO读取照片的全景标识与Facebook SDK上传全

本文链接:https://www.haomeiwen.com/subject/fypxpttx.html