繁体   English   中英

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

[英]Unable to Save UIImage to Camera Roll in Swift 5 XCode 11.6

我正在尝试将生成的 UIImage 保存到相机胶卷。

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

我尝试了几种方法;

我面临的 PHPhotoLibrary 错误是

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

我试过的代码;

UIImageWriteToSavedPhotosAlbum(image!, nil, 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)
    }, completionHandler: { success, 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,

埃尔登

我已经想通了。

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

它返回错误代码 = -1

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

if let output = filter.outputImage?.transformed(by: transform) {
let context = CIContext()
guard let cgImage = context.createCGImage(output, from: output.extent) else { return nil }
return UIImage(cgImage: cgImage)

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM