iOS中如何使用NSItemProvider判断选中的图片是否为同一文件?
判断PHPicker选中的图片是否为同一文件
最可靠方案:利用PHPickerResult的assetIdentifier
当你通过PHPickerViewController选中图片时,每个PHPickerResult对象都携带assetIdentifier属性——这个值是相册内对应资源的唯一标识,和PHAsset的localIdentifier完全一致。不管你通过NSItemProvider拿到的是图片副本还是原文件,只要是同一张相册里的图片,这个标识不会变,直接对比字符串即可判断是否为同一文件。
示例代码:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) // 假设你存储了上一次选中的图片标识 let lastSelectedAssetId: String? = "your_previous_asset_id" for result in results { guard let currentId = result.assetIdentifier else { continue } if currentId == lastSelectedAssetId { print("选中的是同一张图片") } else { print("选中的是不同图片") } } }
兼容低版本的备选方案:计算图片数据哈希
如果需要支持iOS 13及更早版本(assetIdentifier从iOS 14开始可用),可以通过计算图片数据的哈希值来判断。当你从NSItemProvider获取到图片的Data后,计算其MD5或SHA哈希,相同哈希意味着两个副本内容完全一致(即来自同一原文件)。
示例代码(计算MD5哈希):
import CommonCrypto func imageHash(from data: Data) -> String? { var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) data.withUnsafeBytes { _ = CC_MD5($0.baseAddress, CC_LONG(data.count), &hash) } return hash.map { String(format: "%02x", $0) }.joined() } // 使用方式 if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: Data.self) { itemProvider.loadObject(ofClass: Data.self) { data, error in guard let imageData = data as? Data else { return } let currentHash = self.imageHash(from: imageData) // 对比之前存储的哈希值 if currentHash == self.lastImageHash { print("是同一文件的副本") } } }
注意:哈希方案仅能判断两个副本的内容是否完全一致,如果原图片被编辑过(比如裁剪、滤镜),即使来自同一原图,副本内容也会不同,哈希值就会不一样。而
assetIdentifier方案不受编辑影响,只要是同一相册资源,标识始终相同。
内容的提问来源于stack exchange,提问作者strawnut
相关产品推荐
相关产品推荐

