本文介紹如何使用Photos框架修改相冊(cè)中的照片信息
修改照片創(chuàng)建時(shí)間
最近項(xiàng)目在做相冊(cè)常柄,網(wǎng)上找了很久的資料發(fā)現(xiàn)關(guān)于修改相冊(cè)中照片的文章大多都還是使用的AssetsLibrary,但是AssetsLibrary中很多方法都已經(jīng)棄用了存皂,苦尋無果就只能自己看官方文檔了最后找到了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.
使用方法很簡(jiǎn)單寻拂,跟其他修改操作一樣需要寫在performChanges函數(shù)里面
PHPhotoLibrary.shared().performChanges({
//asset是PHAsset 想要修改的照片
let request = PHAssetChangeRequest(for: asset)
//設(shè)置創(chuàng)建時(shí)間
request.creationDate = Date()
}) { (success, error) in
if success == true {
print("修改成功")
}
}
也可以使用其他創(chuàng)建方式程奠,具體使用可以自己試試
open class func creationRequestForAsset(from image: UIImage) -> Self
open class func creationRequestForAssetFromImage(atFileURL fileURL: URL) -> Self?
open class func creationRequestForAssetFromVideo(atFileURL fileURL: URL) -> Self?
修改其他屬性
還有其他幾個(gè)常用屬性可以修改,使用方法都跟創(chuàng)建時(shí)間一致祭钉,在performChanges里面寫就好了
open var creationDate: Date? //創(chuàng)建時(shí)間
open var location: CLLocation? //定位
open var isFavorite: Bool //是否收藏(喜歡)
open var isHidden: Bool //是否隱藏
設(shè)置文件名稱
這里是指保存圖片到相冊(cè)時(shí)設(shè)置文件名稱瞄沙,關(guān)于直接修改相冊(cè)中的文件名稱的方法,還沒有找到慌核,目前也沒有這個(gè)需求就沒有去找了距境,有需求的小伙伴可以自己去看看官方文檔。關(guān)于相冊(cè)中的文件名稱垮卓,iOS系統(tǒng)會(huì)自動(dòng)為每一個(gè)文件命一個(gè)名垫桂,該文件還存在一個(gè)originalFilename也就是原件名,originalFilename是當(dāng)你分享或者傳輸給其他設(shè)備時(shí)的名稱粟按,如果沒有設(shè)置originalFilename就會(huì)使用系統(tǒng)默認(rèn)的命名 樣式是這樣的“IMG_3088.JPG” 默認(rèn)會(huì)從IMG_0001.JPG開始新增并一直累加诬滩,因此兩個(gè)手機(jī)中的文件名基本都是一樣的。
獲取本地照片的名稱及URL
let assets = PHAsset.fetchAssets(with: nil)//獲取相冊(cè)中的所有文件
let asset = assets.firstObject
let assetName = asset?.value(forKey: "filename") as? String //系統(tǒng)命名
let resource = PHAssetResource.assetResources(for: asset!)
let originalName = resource.first?.originalFilename //原件名
let assetURL = resource.first?.value(forKey: "fileURL") as? URL //相冊(cè)文件對(duì)應(yīng)的URL
這里再介紹一下PHAssetResource灭将,我們可以通過PHAssetResource獲取asset的Resource疼鸟,當(dāng)然resource可能是一個(gè)也可能是多個(gè),Livephoto一般會(huì)有兩個(gè)宗侦,其中一個(gè)會(huì)是.mov文件愚臀,從這里也可以看出Livephoto基本就是通過視頻來展示的,想要播放Livephoto也可以嘗試一下使用這個(gè).mov文件播放矾利。當(dāng)然這個(gè)并不是重點(diǎn)姑裂,重點(diǎn)是多個(gè)resource時(shí)應(yīng)該取哪一個(gè)? PHAssetResource里有一個(gè)Type屬性男旗,對(duì)應(yīng)照片舶斧、視頻、音頻還有其他雜七雜八的type察皇,我們需要的僅僅是前兩個(gè)茴厉,通過PHAssetResource的Type與PHAsset的mediaType對(duì)比,只要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
}
}
設(shè)置originalFilename
PHPhotoLibrary.shared().performChanges({
let request = PHAssetCreationRequest.forAsset()
let option = PHAssetResourceCreationOptions()
option.originalFilename = "test.png" //設(shè)置文件名稱
request.addResource(with: .photo, fileURL: URL(fileURLWithPath: "test.png"), options: option) //保存對(duì)應(yīng)圖片到相冊(cè)
}) { (success, error) in
if success == true {
print("保存相冊(cè)成功")
}
}