微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Swift 5 XCode 11.6中无法将UIImage保存到相机胶卷

如何解决在Swift 5 XCode 11.6中无法将UIImage保存到相机胶卷

我正在尝试将生成的UIImage保存到Camera Roll。

我在Info.plist中有必要的隐私字符串。

我尝试了几种方法

PHPhotoLibrary遇到的错误

Error Domain=com.apple.accounts Code=7 "(null)

我尝试过的代码

UIImageWritetoSavedPhotosAlbum(image!,nil,nil);

一个是;

PHPhotoLibrary.shared().savePhoto(image: image!,albumName: "AlbumName",completion: { (asset) in
            
 if asset != nil
 {
               print("error")
 }
})



func savePhoto(image:UIImage,albumName:String,completion:((PHAsset?)->())? = nil) {
    func save() {
        if let album = PHPhotoLibrary.shared().findAlbum(albumName: albumName) {
            PHPhotoLibrary.shared().saveImage(image: image,album: album,completion: completion)
        } else {
            PHPhotoLibrary.shared().createalbum(albumName: albumName,completion: { (collection) in
                if let collection = collection {
                    PHPhotoLibrary.shared().saveImage(image: image,album: collection,completion: completion)
                } else {
                    completion?(nil)
                }
            })
        }
    }

    if PHPhotoLibrary.authorizationStatus() == .authorized {
        save()
    } else {
        PHPhotoLibrary.requestAuthorization({ (status) in
            if status == .authorized {
                save()
            }
        })
    }
}

// MARK: - Private

fileprivate func findAlbum(albumName: String) -> PHAssetCollection? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = nspredicate(format: "title = %@",albumName)
    let fetchResult : PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album,subtype: .any,options: fetchOptions)
    guard let photoAlbum = fetchResult.firstObject else {
        return nil
    }
    return photoAlbum
}

fileprivate func createalbum(albumName: String,completion: @escaping (PHAssetCollection?)->()) {
    var albumPlaceholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
        let createalbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
        albumPlaceholder = createalbumRequest.placeholderForCreatedAssetCollection
    },completionHandler: { success,error in
        if success {
            guard let placeholder = albumPlaceholder else {
                completion(nil)
                return
            }
            let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier],options: nil)
            guard let album = fetchResult.firstObject else {
                completion(nil)
                return
            }
            completion(album)
        } else {
            completion(nil)
        }
    })
}

fileprivate func saveImage(image: UIImage,album: PHAssetCollection,completion:((PHAsset?)->())? = nil) {
    var placeholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
        let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album),let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else { return }
        placeholder = photoPlaceholder
        let fastEnumeration = NSArray(array: [photoPlaceholder] as [PHObjectPlaceholder])
        albumChangeRequest.addAssets(fastEnumeration)
    },error in
        guard let placeholder = placeholder else {
            completion?(nil)
            return
        }
        if success {
            let assets:PHFetchResult<PHAsset> =  PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier],options: nil)
            let asset:PHAsset? = assets.firstObject
            completion?(asset)
        } else {
            completion?(nil)
        }
    })
}

您能帮我解决这个问题吗?

BR,

Erdem

解决方法

我知道了。

问题是我一直在创建使用CIFilter创建的QR图像为CIImage。

它返回错误代码= -1

您需要从CGImage而不是CIImage创建UIImage

constexpr

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。