本文介绍如何使用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("保存相册成功")
}
}