PHAsset的类型判断、视频时长、新增、删除、修改时间、修改地点等操作

本文详细介绍了如何在iOS中使用PHAsset进行照片和视频的管理,包括资源类型的判断、实时照片处理、视频时长获取、资源写入相册、收藏状态修改、照片属性更改等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHAsset

  • 照片库中的一个单独的资源(狭隘可以理解为一张图或则一段视频),以元数据的方式提供,包含所有该资源的信息(例如:唯一标识、创建时间、大小、类型、地点、是否被标记为喜欢等)
  • 用来获取照片库中的PHAsset对象

判断资源类型

  1. 通过PHAsset的PHAssetMediaType判断是image还是video

public enum PHAssetMediaType : Int {
case unknown // 未知
case image    // 图片
case video   // 视频
case audio  // 音频
}

  1. 判断是否是实时照片PHLivePhoto(iOS9.1+ 6s及以上支持 和PHAsset一样也是一个资源包,不同的是他不仅包含一张图片,而且还有一段mov格式的视频(拍摄该照片时前后几秒的视频))

if #available(iOS 9.1, *) {
if asset.mediaSubtypes.contains(.photoLive) {
// 实时照片(以后可以加重压播放视频 用户可以选择时使用照片还是使用视频)
}
}

  1. 判断是否是iCloud图

@objc open class func judgeAssetis(inLocalAblum asset: PHAsset?) -> Bool {
var result = false
let option = PHImageRequestOptions()
option.isNetworkAccessAllowed = false
option.isSynchronous = true
if let asset = asset {
PHCachingImageManager.default().requestImageData(for: asset, options: option, resultHandler: { imageData, _, _, _ in
result = imageData != nil ? true : false
})
}
return result
}

  1. 获取视频时长

// 视频时长
    class open func videoDuration(videoAsset: PHAsset?) -> String {
        guard let asset = videoAsset else { return "00:00" }
        let duration: TimeInterval = asset.duration
        let s: Int = Int(duration) % 60
        let m: Int = Int(duration) / 60
        let formattedDuration = String(format: "%02d:%02d", m, s)
        return formattedDuration
    }

写入资源到相册(图片、视频、PHotoLive等)

1、写入照片(通过image或则Url)


 PHPhotoLibrary.shared().performChanges({
            if let image = resource as? UIImage {
                PHAssetChangeRequest.creationRequestForAsset(from: image)
            } else if let url = resource as? URL {
                assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
            }
            
        }) { (success, error) in
            print("保存成功:\(success)")
        }

2、写入视频


 PHPhotoLibrary.shared().performChanges({
           PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
            
        }) { (success, error) in
            print("保存成功:\(success)")
        }

3、写入PhotoLive

注意:videoUrl和photoUrl需要有关联(例如:photoUrl的图片是video的第几帧。如果俩者没关联就会保存是被)


let videoUrl = URL.init(fileURLWithPath: Bundle.main.path(forResource: "1", ofType: "mov")!)

PHPhotoLibrary.shared().performChanges({
                let assetRequest = PHAssetCreationRequest.forAsset()
                assetRequest.addResource(with: .photo, fileURL: photoUrl, options: nil)
                assetRequest.addResource(with: .pairedVideo, fileURL: videoUrl, options: nil)
            }) { (success, error) in
                if success {
                    self.showAlert(message: "新增LivePhoto成功")
                } else {
                    self.showAlert(message: "新增LivePhoto失败")
                }
            }

收藏或取消


// 收藏或取消asset
    open class func toggleFavorite(asset: PHAsset, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
        PHPhotoLibrary.shared().performChanges({
            let request = PHAssetChangeRequest(for: asset)
            request.isFavorite = !asset.isFavorite
        }, completionHandler: completionHandler)
    }

修改照片添加时间


// 修改照片添加时间
open class func changeAssetDate(asset: PHAsset, date: Date, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
        PHPhotoLibrary.shared().performChanges({
            let request = PHAssetChangeRequest(for: asset)
            request.creationDate = date
        }, completionHandler: completionHandler)
    }

修改照片定位地点

// 修改照片定位地点
open class func changeAssetLocation(asset: PHAsset, location: CLLocation, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
        PHPhotoLibrary.shared().performChanges({
            let request = PHAssetChangeRequest(for: asset)
            request.location = location
        }, completionHandler: completionHandler)
    }

修改照片是否隐藏

// 修改照片是否隐藏
open class func changeAssetIsHide(asset: PHAsset, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
        PHPhotoLibrary.shared().performChanges({
            let request = PHAssetChangeRequest(for: asset)
            request.isHidden = !asset.isHidden
        }, completionHandler: completionHandler)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值