ios - 如何检测照片是否是用 iPhone 拍摄的
问题描述
我知道如何使用来自objective-c 的PhotoKit(例如PHAsset,PhotoLibrary,...)的API 访问iPhone 上的照片。
如何安全地确定照片是否是使用运行我的代码的 iPhone 拍摄的?是否有任何属性(例如 PHAsset 或 EXIF)可以可靠地用于此目的?我的应用程序应该只使用使用当前手机的相机实际拍摄的照片。
解决方案
首先,您需要获取图像的元数据。如果使用 PHAsset,您可以创建一些扩展来获取元数据。例如:
-(void)requestMetadataWithCompletionBlock:(PHAssetMetadataBlock)completionBlock{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
PHContentEditingInputRequestOptions *editOptions = [[PHContentEditingInputRequestOptions alloc] init];
editOptions.networkAccessAllowed = YES;
[self requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
CIImage *image = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL];
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(image.properties);
});
}];
});
}
在字典中可以找到相机制造商。例如:
...
Make = Apple;
Model = "iPod touch";
...
还值得一看ImageIO Framework,在这里你会找到一些用于元数据解析的默认键和其他有用的信息。
但是没有公开的 API 告诉你这张照片是由当前的 iOS 设备拍摄的。
推荐阅读
- redux - React Redux Thunk 在 Action Creator 中传递 This.Props 方法
- sql - 具有不同列的 INNER JOIN
- mysql - centos7无法登录phpmyadmin
- java - 使用字符串生成器将 XML 放置在单个 csv/xls 列中不起作用
- javascript - 在 Angular JS 上预先填写关键字搜索过滤器
- jqplot - jqPlot - 绘制面积图和条形图/折线图时颜色的重叠
- sql-server - 如何创建只能访问运行存储过程的登录名?
- amazon-web-services - 在 GCP 中,与使用共享 vpc 相比,具有 vpc 对等的中心辐射模型更好
- r - 我正在尝试计算出现的数量并传播到多个列,并希望随着时间的推移将数字聚合
- java - 如何修改抽象数据类型 (ADT) 堆栈?