使用 phimagemanager 将图像保存到自定义相册?

2024-04-15

我正在制作一个使用 AVFoundation 拍照的应用程序,我想将它们保存到一个自定义相册中,然后我可以查询并在我的应用程序中显示。 (我不想把它们放在一般的照片卷中,除非用户想要)我真的找不到任何东西来展示如何在 Swift 中做到这一点......或者根本找不到。我应该采取不同的方式来做到这一点吗?

我在 SO 上找到了这个例子,但它对我来说没有意义,我无法让它工作。

    func savePhoto() {
    var albumFound : Bool = false
    var assetCollection: PHAssetCollection!
    var photosAsset: PHFetchResult!
    var assetThumbnailSize:CGSize!

    // Create the album if does not exist (in viewDidLoad)
    if let first_Obj:AnyObject = collection.firstObject{
        //found the album
        self.albumFound = true
        self.assetCollection = collection.firstObject as PHAssetCollection
    }else{
        //Album placeholder for the asset collection, used to reference collection in completion handler
        var albumPlaceholder:PHObjectPlaceholder!
        //create the folder
        NSLog("\nFolder \"%@\" does not exist\nCreating now...", albumName)
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
            let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
            albumPlaceholder = request.placeholderForCreatedAssetCollection
            },
            completionHandler: {(success:Bool, error:NSError!)in
                NSLog("Creation of folder -> %@", (success ? "Success":"Error!"))
                self.albumFound = (success ? true:false)
                if(success){
                    let collection = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([albumPlaceholder.localIdentifier], options: nil)
                    self.assetCollection = collection?.firstObject as PHAssetCollection
                }
        })
    }



    let bundle = NSBundle.mainBundle()
    let myFilePath = bundle.pathForResource("highlight1", ofType: "mov")
    let videoURL:NSURL = NSURL.fileURLWithPath(myFilePath!)!

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0), {
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
            //let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage
            let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(videoURL)
            let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset
            let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset)
            albumChangeRequest.addAssets([assetPlaceholder])
            }, completionHandler: {(success, error)in
                dispatch_async(dispatch_get_main_queue(), {
                    NSLog("Adding Image to Library -> %@", (success ? "Sucess":"Error!"))
                    //picker.dismissViewControllerAnimated(true, completion: nil)
                })
        })

    })
}

任何帮助/解释都会很棒!


我就是这样做的:

在顶部:

import Photos

var image: UIImage!
var assetCollection: PHAssetCollection!
var albumFound : Bool = false
var photosAsset: PHFetchResult!
var assetThumbnailSize:CGSize!
var collection: PHAssetCollection!
var assetCollectionPlaceholder: PHObjectPlaceholder!

创建相册:

func createAlbum() {
    //Get PHFetch Options
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", "camcam")
    let collection : PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)
    //Check return value - If found, then get the first album out
    if let _: AnyObject = collection.firstObject {
        self.albumFound = true
        assetCollection = collection.firstObject as! PHAssetCollection
    } else {
        //If not found - Then create a new album
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
            let createAlbumRequest : PHAssetCollectionChangeRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle("camcam")
            self.assetCollectionPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
            }, completionHandler: { success, error in
                self.albumFound = success

                if (success) {
                    let collectionFetchResult = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([self.assetCollectionPlaceholder.localIdentifier], options: nil)
                    print(collectionFetchResult)
                    self.assetCollection = collectionFetchResult.firstObject as! PHAssetCollection
                }
        })
    }
}

保存照片时:

func saveImage(){
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
            let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(self.image)
            let assetPlaceholder = assetRequest.placeholderForCreatedAsset
            let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset)
            albumChangeRequest!.addAssets([assetPlaceholder!])
            }, completionHandler: { success, error in
                print("added image to album")
                print(error)

                self.showImages()
        })
    }

显示该相册中的图像:

func showImages() {
        //This will fetch all the assets in the collection

        let assets : PHFetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: nil)
        print(assets)

        let imageManager = PHCachingImageManager()
        //Enumerating objects to get a chached image - This is to save loading time
        assets.enumerateObjectsUsingBlock{(object: AnyObject!,
            count: Int,
            stop: UnsafeMutablePointer<ObjCBool>) in

            if object is PHAsset {
                let asset = object as! PHAsset
                print(asset)

                let imageSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)

                let options = PHImageRequestOptions()
                options.deliveryMode = .FastFormat

                imageManager.requestImageForAsset(asset, targetSize: imageSize, contentMode: .AspectFill, options: options, resultHandler: {(image: UIImage?,
                    info: [NSObject : AnyObject]?) in
                    print(info)
                    print(image)
                })
            }
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 phimagemanager 将图像保存到自定义相册? 的相关文章

随机推荐

  • 如何将大精灵 png 切成较小的 UIImages?

    例如 png文件是1200 h x 50 w 像素 我怎样才能cutpng 并加载为 6UIImages 每个 200 高 x 50 宽 谢谢 编辑 感谢 Michal 的回答 最终代码 CGImageRef imageToSplit UI
  • 如何在 pytest 中仅运行未标记的测试

    我的 python 测试代码中有几个标记 pytest mark slowtest pytest mark webtest pytest mark stagingtest 我可以使用标记有选择地运行测试 例如pytest m slowtes
  • AEM 6.1 Maven 依赖关系解析

    我使用 AEM6 1 和 Maven 作为构建管理器 我想延长com day cq dam core process ThumbnailProcess班级 使用 ARM 内置依赖解析器 系统 控制台 depfinder 看来该类应该包含在
  • 如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

    我最近一直在学习 Swift 我决定编写一个混合 Swift Objective C 应用程序 使用两种语言实现的相同算法来执行计算密集型任务 该程序计算大量素数 我定义了一个 Swift 和 Objective C 版本的计算对象都应该遵
  • 使用 Windows 身份验证从网络共享批量插入 SQL Server 需要哪些权限?

    我正在开发一个将数据批量加载到 SQL Server 2008 数据库中的应用程序 它将 CSV 文件写入网络共享 然后调用包含 BULK INSERT 命令的存储过程 我正在将应用程序迁移到一个全新的网络 在这个新世界中 批量插入失败并出
  • Rust 柴油 orm 查询

    我是生锈和柴油奥姆的新手 我正在尝试在我的查询中执行以下操作 count select order limit 但我收到错误 我正在使用 postgres 数据库 我已在评论中的查询上方添加了确切的错误 这是我的代码 模式 rs table
  • 如何使用 React 过渡组为每个项目使用不同的延迟?

    我正在使用动画来制作一系列项目的进入和退出TransitionGroup and CSSTransition 具有淡入淡出效果 我希望这些项目之间有轻微的延迟 而不是同时出现 请注意 延迟可以低于动画的持续时间 使用我当前的代码 所有项目都
  • 为什么 grails run-app 在编译期间尝试访问远程服务器

    我发现我的 grails 应用程序编译过程中出现了一些错误 Loading Grails 2 0 4 Configuring classpath problems summary ERRORS Server access Error Une
  • 使用 Visual Studio 2012 构建面向 Windows XP 的 Boost 1.52 库

    Visual Studio 2012 Update 1 使用工具集 vc110 xp 启用了对 Windows XP 目标的支持 如何配置 Boost 1 52 以使用 vc110 xp 工具集构建库 我发现最简单的方法是编辑 Progra
  • 处理 android 中 RestClient 调用的连接和读取超时

    我有一个 RestService 接口 其中包含许多休息调用 我在整个应用程序中使用这些调用 我正在设置处理超时connection and read timeouts ClientHttpRequestFactory httpFactor
  • Powershell在导入txt文件时跳过前2行

    我有一个 powershell 脚本 旨在读取远程服务器上的 txt 文件并将其导入 SQL 中 我希望能够跳过 txt 文件的前两行 我目前正在使用下面的代码来导入文件 txt 文件已分隔 datatable new object Sys
  • 不使用 Obfuscator 的 DLL 加密

    事实上 我被分配了一项任务来保护我的 DLL 这样 如果我将我的软件部署到任何系统 就没有人可以修改或读取我的 DLL 你能帮我如何在不使用混淆器的情况下对其进行加密吗 您将需要软件来执行此操作 以下是您可能需要考虑的一些软件 Eazfus
  • 在另一个 AppDomain 中调用 Await 时没有 SynchronizationContext

    我已经成功构建了一个插件机制 可以在单独的 AppDomain 中创建 UI 控件 并将它们显示为主 AppDomain 中表单的一部分 这些 UI 控件会加载自己的数据 因此当我打开表单时 会创建大约 10 个不同的插件 每个插件都需要加
  • 在ExoPlayer中,到底如何使用SimpleExoPlayer.setVideoScalingMode就像在ImageView center-crop中一样?

    背景 我正在尝试以中心裁剪方式显示视频 就像在 ImageView 上一样 我也希望我能找到如何以其他方式扩展规模 就像上所做的那样这个图书馆 https github com yqritc Android ScalableVideoVie
  • 使用 NancyFX 时出现 Razor 编译错误

    我正在使用 Nancyfx 和 Visual Studio 2012 中的 Razor 视图引擎在 C 中创建一个黑杰克程序 Visual studios Intelisense 可以工作 但我收到这些 Razor 编译错误 我尝试在 ap
  • 重载Python中的所有算术运算符

    假设我构建一个类 它基本上代表一个数字加上一些奇特的东西 该类的实例的行为应该类似于任何算术 数学运算中的数字 我可以重载该类中的所有数字运算符 但是没有更短的解决方案吗 该类基本上如下所示 class MyFancyNumber def
  • Python 正则表达式错误字符范围。

    我使用以下正则表达式来匹配不同的日期模式 它在 regex101 com 中工作正常 但是当我导入到 python 时 我收到 错误字符范围 异常 pattern ur b january jan february feb march ma
  • Kivy AttributeError:“超级”对象没有 ScreenManager 的属性“__getattr__”[重复]

    这个问题在这里已经有答案了 我正在尝试将方法绑定到微调器的文本值 最迟需要在显示 TestScreen 时进行绑定 如果我不使用 ScreenManager 这将有效 例如 如果 TestApp build 返回 TestScreen 而不
  • 在持续集成下删除和创建数据库的防弹方法

    我正在尝试从 CI 设置中删除并重新创建数据库 但我发现很难自动删除和创建数据库 考虑到正在使用的数据库的复杂性 这是可以预料的 有时 进程会挂起 错误提示 数据库当前正在使用 或者只是花费太长时间 我不在乎数据库是否正在使用 我想杀死它并
  • 使用 phimagemanager 将图像保存到自定义相册?

    我正在制作一个使用 AVFoundation 拍照的应用程序 我想将它们保存到一个自定义相册中 然后我可以查询并在我的应用程序中显示 我不想把它们放在一般的照片卷中 除非用户想要 我真的找不到任何东西来展示如何在 Swift 中做到这一点