iOS Swift Photos框架 修改相册照片 创建时间 定位 设置文件名称

本文介绍如何使用Photos框架修改相册中的照片信息

修改照片创建时间

最近项目在做相册,网上找了很久的资料发现关于修改相册中照片的文章大多都还是使用的AssetsLibrary,但是AssetsLibrary中很多方法都已经弃用了,苦寻无果就只能自己看官方文档了最后找到了PHAssetChangeRequest,注释如下:

  PHAssetChangeRequest 
  A request to create, delete, change metadata for, or edit the content of a Photos asset, for use in a photo library change block.

使用方法很简单,跟其他修改操作一样需要写在performChanges函数里面

  PHPhotoLibrary.shared().performChanges({
        //asset是PHAsset 想要修改的照片
        let request = PHAssetChangeRequest(for: asset)
        //设置创建时间
        request.creationDate = Date()
    }) { (success, error) in
        if success == true {
            print("修改成功")
        }
    }

也可以使用其他创建方式,具体使用可以自己试试

open class func creationRequestForAsset(from image: UIImage) -> Self

open class func creationRequestForAssetFromImage(atFileURL fileURL: URL) -> Self?

open class func creationRequestForAssetFromVideo(atFileURL fileURL: URL) -> Self?

修改其他属性

还有其他几个常用属性可以修改,使用方法都跟创建时间一致,在performChanges里面写就好了

open var creationDate: Date? //创建时间

open var location: CLLocation? //定位

open var isFavorite: Bool //是否收藏(喜欢)


open var isHidden: Bool  //是否隐藏

设置文件名称

这里是指保存图片到相册时设置文件名称,关于直接修改相册中的文件名称的方法,还没有找到,目前也没有这个需求就没有去找了,有需求的小伙伴可以自己去看看官方文档。关于相册中的文件名称,iOS系统会自动为每一个文件命一个名,该文件还存在一个originalFilename也就是原件名,originalFilename是当你分享或者传输给其他设备时的名称,如果没有设置originalFilename就会使用系统默认的命名 样式是这样的“IMG_3088.JPG” 默认会从IMG_0001.JPG开始新增并一直累加,因此两个手机中的文件名基本都是一样的。

获取本地照片的名称及URL

    let assets = PHAsset.fetchAssets(with: nil)//获取相册中的所有文件
    let asset = assets.firstObject
    let assetName = asset?.value(forKey: "filename") as? String //系统命名
    let resource = PHAssetResource.assetResources(for: asset!)
    let originalName = resource.first?.originalFilename //原件名
    let assetURL = resource.first?.value(forKey: "fileURL") as? URL //相册文件对应的URL

这里再介绍一下PHAssetResource,我们可以通过PHAssetResource获取asset的Resource,当然resource可能是一个也可能是多个,Livephoto一般会有两个,其中一个会是.mov文件,从这里也可以看出Livephoto基本就是通过视频来展示的,想要播放Livephoto也可以尝试一下使用这个.mov文件播放。当然这个并不是重点,重点是多个resource时应该取哪一个? PHAssetResource里有一个Type属性,对应照片、视频、音频还有其他杂七杂八的type,我们需要的仅仅是前两个,通过PHAssetResource的Type与PHAsset的mediaType对比,只要rawValue是相等的就是我们需要的PHAssetResource。

  let resources = PHAssetResource.assetResources(for: asset)
  var originalName: String?
  for item in resources {
    if item.type.rawValue == asset.mediaType.rawValue {
      originalName = item.originalFilename
      break
     }
  }

设置originalFilename

  PHPhotoLibrary.shared().performChanges({
        let request = PHAssetCreationRequest.forAsset()
        let option = PHAssetResourceCreationOptions()
        option.originalFilename = "test.png" //设置文件名称
        request.addResource(with: .photo, fileURL: URL(fileURLWithPath: "test.png"), options: option) //保存对应图片到相册
    }) { (success, error) in
        if success == true {
            print("保存相册成功")
        }
    }

最后,以上操作都需要先请求相册读写权限,这里就不多说了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 在微博上出现了越来越多的被标记为 Live 的图片,这种图片是一种动图 LivePhoto,长按之后会进行播放。那...
    wvqusrtg阅读 5,021评论 0 9
  • 这是大女儿的第三幅工笔画作品-多二乔牡丹扇面图。完成于2017年7月2日。当时大女儿7岁9个月。由工笔画老师指导完成。
    盼好运阅读 1,408评论 7 7
  • 007之路第一篇,给自己打call,给同行的战友们打call。既然知道在做的这件事是好的,是对的,那就坚持下...
    多拉小A阅读 629评论 2 0
  • 一直想写篇文章来阐述我的抑郁症痊愈史,以及我想告诉诸位患者的是,抑郁症可以治好,可以让你像以前一样阳光快乐。之所以...
    林溪則阅读 33,696评论 29 33