TZImagePickerController获取原图
调起相册
let imgSelectVC = TZImagePickerController(maxImagesCount: 1, columnNumber: 4, delegate: self, pushPhotoPickerVc: true)
imgSelectVC?.allowPickingOriginalPhoto = true
imgSelectVC?.allowPickingVideo = false
imgSelectVC?.allowPickingGif = false
imgSelectVC?.allowTakeVideo = false
imgSelectVC?.showSelectBtn = true
imgSelectVC?.allowTakePicture = false
weakSelf.present(imgSelectVC!, animated: true, completion: nil)
获取原图方法: -> 代理方法:
func imagePickerController(_ picker: TZImagePickerController!, didFinishPickingPhotos photos: [UIImage]!, sourceAssets assets: [Any]!, isSelectOriginalPhoto: Bool) {
if isSelectOriginalPhoto{
//选择了原图
guard let assets = assets as? [PHAsset] else {
return
}
/// 初始化信号量为1,最大并发为1,为0时会等待
let semap = DispatchSemaphore.init(value: 0)
var source: [YPQuickImageCCellVM] = []
DispatchQueue.main.async {
YPProgressHUD.show()
}
DispatchQueue.global().async {
let group = DispatchGroup()
let queue = DispatchQueue.global()
assets.forEach { asset in
queue.async(group: group, execute: {
})
}
assets.forEach { asset in
let item = YPQuickImageCCellVM.init(image: nil, asset: asset)
TZImageManager.default().getOriginalPhoto(with: asset) { image, info in
/// 是否是低清图
guard let isThumb = info?["PHImageResultIsDegradedKey"] as? Bool else{ return }
if isThumb{
//缩略图
item.image = image
}else{
//高清图
item.original = image
semap.signal()
}
}
semap.wait()
source.append(item)
}
DispatchQueue.main.async {[weak self] in
YPProgressHUD.hide()
guard let weakSelf = self else {return}
var dataSource: [YPQuickImageCCellVM] = source
if source.count < 3,
let image = UIImage.init("image_updat"){
dataSource.append(.init(default: image))
}
weakSelf.dataSource.accept(dataSource)
}
}
}else{
let source = photos.enumerated().map{ photo -> YPQuickImageCCellVM in
return YPQuickImageCCellVM.init(image: photo.element, asset: assets.safe(idx: photo.offset) as? PHAsset)
}
var dataSource: [YPQuickImageCCellVM] = source
if source.count < 3,
let image = UIImage.init("image_updat"){
dataSource.append(.init(default: image))
}
self.dataSource.accept(dataSource)
}
}
}
主要是通过 TZImageManager.default().getOriginalPhoto(with: asset)方法获取原图. 注意的是需要到异步线程操作.
/// 等比例计算图片高度.
/// let midbgIconH = getFit(167)
/// let midbgIconW = midbgIconH*700/167
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律