【问题标题】:Is it possible to save a reference to where a photo is stored from the photo library instead of saving the actual UIImage itself as data?是否可以从照片库中保存对照片存储位置的引用,而不是将实际的 UIImage 本身保存为数据?
【发布时间】:2018-01-02 12:10:16
【问题描述】:

我想在我的 iOS 应用程序中将图像保存在 Core Data 中,但我要保存的所有图像都是从照片库中导入的。因此,从照片库中保存对该照片的现有引用会更有意义,而不是尝试将图像转换为 NSData 并将其存储在手机中。特别是因为图像占用了大量内存,理想情况下它们不应该保存在两个地方。我正在尝试做的事情是否可能,或者苹果不会让我阅读照片库中照片存储位置的参考资料?

此外,如果可以从照片库中获取对图像存储位置的引用,我如何在 Swift 中访问它?

【问题讨论】:

    标签: ios core-data reference photolibrary


    【解决方案1】:

    这是一个迟到的答案,但希望它会对其他人有所帮助。

    是的,这是可能的。您可以使用PHPickerViewController 选择照片以获取具有assetIdentifier 属性的PHPickerResultassetIdentifier 持久且唯一地标识照片。当您要加载图像时,读取保存的assetIdentifier 并使用PHAsset.fetchAssets() 检索资产,然后使用PHImageManager.requestImage() 获取UIImage。这样,您需要在应用中存储的只是assetIdentifier,而不是图像数据。

    这里是一些示例代码(适用于 iOS15),用于选择一张照片并获取 assetIdentifier

    import PhotosUI
    import SwiftUI
    
    struct PhotoPicker: UIViewControllerRepresentable {
        @Environment(\.dismiss) var dismiss
        @Binding var assetIdentifier: String?
    
        typealias UIViewControllerType = PHPickerViewController
        func makeUIViewController(context: Context) -> PHPickerViewController {
            var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
            configuration.selectionLimit = 1
            configuration.filter = .images
    
            let picker = PHPickerViewController(configuration: configuration)
            picker.delegate = context.coordinator
    
            return picker
        }
    
        func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {
            // Do nothing.
        }
    
        func makeCoordinator() -> Coordinator {
            Coordinator(self)
        }
    
        class Coordinator: NSObject, UINavigationControllerDelegate, PHPickerViewControllerDelegate {
            let parent: PhotoPicker
    
            init(_ parent: PhotoPicker) {
                self.parent = parent
            }
    
            func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
                parent.dismiss()
    
                // Only 1 image can be selected, so ignore any additional elements.
                guard let result = results.first else {
                    return
                }
    
                parent.assetIdentifier = result.assetIdentifier
            }
        }
    }
    

    要使用它:PhotoPicker(assetIdentifier: $assetIdentifier)

    然后从assetIdentifier 检索图像使用:

    import Photos
    import SwiftUI
    
    struct LoadedImageView: View {
        @State var assetIdentifier: String
        @State private var image: Image? = nil
    
        var body: some View {
            VStack {
                if let image = image {
                    image
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                }
            }
            .onAppear(perform: loadImage)
        }
    
        func loadImage() {
            let fetchResults: PHFetchResult<PHAsset> =
                PHAsset.fetchAssets(withLocalIdentifiers: [assetIdentifier], options: nil)
    
            guard let asset: PHAsset = fetchResults.firstObject else {
                return
            }
    
            let manager = PHImageManager()
            manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize,
                                    contentMode: .aspectFit, options: nil) { (uiImage, _) in
                if let uiImage = uiImage {
                    self.image = Image(uiImage: uiImage)
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      PHObject 类的 localIdentifier 属性是一个唯一的字符串,它永久地标识对象。同时,您可以将其用于可以获取图像数据的 PHAsset 的 fetchAssetsWithLocalIdentifiers: 方法。

      【讨论】:

      • 即使图像数据没有保存在我的应用程序中,我也可以使用它来获取对它的引用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多