HXPhotoModel.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. //
  2. // HXPhotoModel.h
  3. // HXPhotoPickerExample
  4. //
  5. // Created by Silence on 17/2/8.
  6. // Copyright © 2017年 Silence. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "HXPhotoTypes.h"
  10. @class HXPhotoManager;
  11. @class HXPhotoEdit;
  12. @class HXAssetURLResult;
  13. @interface HXPhotoModel : NSObject<NSCoding>
  14. /// 创建日期
  15. /// 如果是通过相机拍摄的并且没有保存到相册(临时的) 为当前时间([NSDate date])
  16. @property (strong, nonatomic) NSDate * _Nullable creationDate;
  17. /// 修改日期
  18. /// 如果是通过相机拍摄的并且没有保存到相册(临时的) 为当前时间([NSDate date])
  19. @property (strong, nonatomic) NSDate * _Nullable modificationDate;
  20. /// 位置信息 CLLocation 对象
  21. /// 通过相机拍摄的时候有定位权限的话就有值
  22. @property (strong, nonatomic) CLLocation * _Nullable location;
  23. /// 照片类型
  24. @property (assign, nonatomic) HXPhotoModelMediaType type;
  25. /// 照片子类型
  26. @property (assign, nonatomic) HXPhotoModelMediaSubType subType;
  27. @property (assign, nonatomic) HXPhotoModelMediaTypeCameraPhotoType cameraPhotoType;
  28. @property (assign, nonatomic) HXPhotoModelMediaTypeCameraVideoType cameraVideoType;
  29. /// PHAsset对象
  30. @property (strong, nonatomic) PHAsset * _Nullable asset;
  31. /// 照片格式
  32. @property (assign, nonatomic) HXPhotoModelFormat photoFormat;
  33. /// 视频秒数
  34. @property (nonatomic, assign) NSTimeInterval videoDuration;
  35. /// 选择的下标
  36. @property (assign, nonatomic) NSInteger selectedIndex;
  37. /// 模型所对应的选中下标
  38. @property (copy, nonatomic) NSString * _Nullable selectIndexStr;
  39. /// 照片原始宽高
  40. @property (assign, nonatomic) CGSize imageSize;
  41. /// 本地视频URL / 网络视频地址
  42. /// 系统相册的资源(PHAsset不为nil的)需要通过exportVideoWithPresetName...方法获取
  43. @property (strong, nonatomic) NSURL * _Nullable videoURL;
  44. /// livephoto - 网络视频地址
  45. @property (strong, nonatomic) NSURL * _Nullable livePhotoVideoURL;
  46. /// 网络图片的地址
  47. @property (copy, nonatomic) NSURL * _Nullable networkPhotoUrl;
  48. /// 网络图片缩略图地址
  49. @property (strong, nonatomic) NSURL * _Nullable networkThumbURL;
  50. /// 网络图片的大小
  51. //@property (assign, nonatomic) NSUInteger networkImageSize;
  52. /// 临时的列表小图 - 本地图片才用这个上传
  53. /// 获取图片请使用 request相关方法
  54. @property (strong, nonatomic) UIImage * _Nullable thumbPhoto;
  55. /// 临时的预览大图 - 本地图片才用这个上传
  56. /// 获取图片请使用 request相关方法
  57. @property (strong, nonatomic) UIImage * _Nullable previewPhoto;
  58. /// 图片本地地址
  59. /// 正常情况下为空
  60. /// 1.调用过 requestImageURLStartRequestICloud 这个方法会有值
  61. /// 2.HXPhotoConfiguration.requestImageAfterFinishingSelection = YES 时,并且选择了原图或者 tpye = HXPhotoModelMediaTypePhotoGif 有值
  62. @property (strong, nonatomic) NSURL * _Nullable imageURL;
  63. #pragma mark - < Disabled >
  64. /// 是否正在下载iCloud上的资源
  65. @property (assign, nonatomic) BOOL iCloudDownloading;
  66. /// iCloud下载进度
  67. @property (assign, nonatomic) CGFloat iCloudProgress;
  68. /// 下载iCloud的请求id
  69. @property (assign, nonatomic) PHImageRequestID iCloudRequestID;
  70. /// 预览界面导航栏上的大标题
  71. @property (copy, nonatomic) NSString * _Nullable barTitle;
  72. /// 预览界面导航栏上的小标题
  73. @property (copy, nonatomic) NSString * _Nullable barSubTitle;
  74. /// PHAsset对象唯一标示
  75. @property (copy, nonatomic) NSString * _Nullable localIdentifier;
  76. /// 是否iCloud上的资源
  77. @property (nonatomic, assign) BOOL isICloud;
  78. /// 当前照片所在相册的名称
  79. @property (copy, nonatomic) NSString * _Nullable albumName;
  80. /// 视频时长
  81. @property (copy, nonatomic) NSString * _Nullable videoTime;
  82. /// cell是否显示过
  83. @property (assign, nonatomic) BOOL dateCellIsVisible;
  84. /// 是否选中
  85. @property (assign, nonatomic) BOOL selected;
  86. /// 预览界面按比例缩小之后的宽高
  87. @property (assign, nonatomic) CGSize endImageSize;
  88. /// 3dTouch按比例缩小之后的宽高
  89. @property (assign, nonatomic) CGSize previewViewSize;
  90. /// 预览界面底部cell按比例缩小之后的宽高
  91. @property (assign, nonatomic) CGSize dateBottomImageSize;
  92. /// 拍照之后的唯一标示
  93. @property (copy, nonatomic) NSString * _Nullable cameraIdentifier;
  94. /// 当前图片所在相册的下标
  95. @property (assign, nonatomic) NSInteger currentAlbumIndex;
  96. /// 网络图片已下载的大小
  97. @property (assign, nonatomic) NSInteger receivedSize;
  98. /// 网络图片总的大小
  99. @property (assign, nonatomic) NSInteger expectedSize;
  100. /// 网络图片是否下载完成
  101. @property (assign, nonatomic) BOOL downloadComplete;
  102. /// 网络图片是否下载错误
  103. @property (assign, nonatomic) BOOL downloadError;
  104. /// 视频当前播放的时间
  105. @property (assign, nonatomic) NSTimeInterval videoCurrentTime;
  106. /// 当前资源的大小 单位:b 字节
  107. /// 网络图片/视频为0
  108. @property (assign, nonatomic) NSUInteger assetByte;
  109. @property (assign, nonatomic) BOOL requestAssetByte;
  110. /// 编辑的数据
  111. /// 传入之前的编辑数据可以在原有基础上继续编辑
  112. @property (strong, nonatomic) HXPhotoEdit * _Nullable photoEdit;
  113. /// 是否隐藏选择按钮
  114. @property (assign, nonatomic) BOOL needHideSelectBtn;
  115. /// 如果当前为视频资源时的视频状态
  116. @property (assign, nonatomic) HXPhotoModelVideoState videoState;
  117. @property (copy, nonatomic) NSString * _Nullable cameraNormalImageNamed;
  118. @property (copy, nonatomic) NSString * _Nullable cameraPreviewImageNamed;
  119. @property (assign, nonatomic) BOOL loadOriginalImage;
  120. /// 临时图片
  121. @property (strong, nonatomic) UIImage * _Nullable tempImage;
  122. #pragma mark - < init >
  123. /// 通过image初始化
  124. /// @param image UIImage
  125. + (instancetype _Nullable)photoModelWithImage:(UIImage * _Nullable)image;
  126. /// 通过视频地址和视频时长初始化
  127. /// @param videoURL 视频地址
  128. /// @param videoTime 视频时长
  129. + (instancetype _Nullable)photoModelWithVideoURL:(NSURL * _Nullable)videoURL videoTime:(NSTimeInterval)videoTime;
  130. /// 通过本地视频地址URL对象初始化
  131. /// @param videoURL 本地视频地址URL
  132. + (instancetype _Nullable)photoModelWithVideoURL:(NSURL * _Nullable)videoURL;
  133. /// 通过PHAsset对象初始化
  134. /// @param asset PHAsset
  135. + (instancetype _Nullable)photoModelWithPHAsset:(PHAsset * _Nullable)asset;
  136. /// 通过视频PHAsset对象初始化视频封面
  137. /// @param asset PHAsset
  138. + (instancetype _Nullable)videoCoverWithPHAsset:(PHAsset * _Nullable)asset;
  139. /// 通过网络图片URL对象初始化
  140. /// @param imageURL 网络图片URL
  141. + (instancetype _Nullable)photoModelWithImageURL:(NSURL * _Nullable)imageURL;
  142. + (instancetype _Nullable)photoModelWithImageURL:(NSURL * _Nullable)imageURL thumbURL:(NSURL * _Nullable)thumbURL;
  143. /// 网络视频初始化
  144. /// @param videoURL 网络视频地址
  145. /// @param videoCoverURL 视频封面地址
  146. /// @param videoDuration 视频时长
  147. + (instancetype _Nullable)photoModelWithNetworkVideoURL:(NSURL *_Nonnull)videoURL
  148. videoCoverURL:(NSURL *_Nonnull)videoCoverURL
  149. videoDuration:(NSTimeInterval)videoDuration;
  150. /// 通过本地图片和视频生成本地LivePhoto
  151. /// @param image 本地图片
  152. /// @param videoURL 本地视频地址
  153. + (instancetype _Nullable)photoModelWithLivePhotoImage:(UIImage * _Nullable)image
  154. videoURL:(NSURL * _Nullable)videoURL;
  155. /// 通过网络图片和视频生成本地LivePhoto
  156. /// @param imageURL 网络图片地址
  157. /// @param videoURL 网络视频地址
  158. + (instancetype _Nullable)photoModelWithLivePhotoNetWorkImage:(NSURL * _Nullable)imageURL
  159. netWorkVideoURL:(NSURL * _Nullable)videoURL;
  160. /// 判断两个HXPhotoModel是否是同一个
  161. /// @param photoModel 模型
  162. - (BOOL)isEqualToPhotoModel:(HXPhotoModel * _Nullable)photoModel;
  163. /// 获取当前asset是不是iCloud上的资源
  164. - (void)isICloudAssetWithCompletion:(void (^_Nullable)(BOOL isICloud, HXPhotoModel * _Nullable model))completion;
  165. #pragma mark - < Request >
  166. + (id _Nullable)requestImageWithURL:(NSURL *_Nullable)url progress:(void (^ _Nullable) (NSInteger receivedSize, NSInteger expectedSize))progress completion:(void (^ _Nullable) (UIImage * _Nullable image, NSURL * _Nullable url, NSError * _Nullable error))completion;
  167. /// 请求获取缩略图,主要用在列表上展示。此方法会回调多次,如果为视频的话就是视频封面
  168. - (PHImageRequestID)requestThumbImageCompletion:(HXModelImageSuccessBlock _Nullable)completion;
  169. - (PHImageRequestID)requestThumbImageWithWidth:(CGFloat)width
  170. completion:(HXModelImageSuccessBlock _Nullable)completion;
  171. /// 请求获取缩略图,主要用在列表上展示。此方法只会回调一次
  172. - (PHImageRequestID)highQualityRequestThumbImageWithWidth:(CGFloat)width
  173. completion:(HXModelImageSuccessBlock _Nullable )completion;
  174. /// 请求获取预览大图,此方法只会回调一次,如果为视频的话就是视频封面
  175. /// @param size 请求图片质量大小,不是尺寸的大小
  176. - (PHImageRequestID)requestPreviewImageWithSize:(CGSize)size
  177. startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  178. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  179. success:(HXModelImageSuccessBlock _Nullable)success
  180. failed:(HXModelFailedBlock _Nullable)failed;
  181. /// 请求获取LivePhoto
  182. /// @param size 请求图片质量大小,不是尺寸的大小
  183. - (PHImageRequestID)requestLivePhotoWithSize:(CGSize)size
  184. startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  185. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  186. success:(HXModelLivePhotoSuccessBlock _Nullable)success
  187. failed:(HXModelFailedBlock _Nullable)failed;
  188. /// 请求获取本地LivePhoto
  189. - (void)requestLocalLivePhotoWithReqeustID:(void (^ _Nullable)(PHLivePhotoRequestID requestID))requestID
  190. header:(void (^ _Nullable)(AVAssetWriter * _Nullable writer, AVAssetReader * _Nullable videoReader, AVAssetReader * _Nullable audioReader))header
  191. completion:(HXModelLivePhotoSuccessBlock _Nullable)completion;
  192. /// 请求获取ImageData
  193. - (PHImageRequestID)requestImageDataStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  194. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  195. success:(HXModelImageDataSuccessBlock _Nullable)success
  196. failed:(HXModelFailedBlock _Nullable)failed;
  197. - (PHImageRequestID)requestImageDataWithLoadOriginalImage:(BOOL)originalImage
  198. startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  199. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  200. success:(HXModelImageDataSuccessBlock _Nullable)success
  201. failed:(HXModelFailedBlock _Nullable)failed;
  202. /// 请求获取AVAsset
  203. - (PHImageRequestID)requestAVAssetStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  204. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  205. success:(HXModelAVAssetSuccessBlock _Nullable)success
  206. failed:(HXModelFailedBlock _Nullable)failed;
  207. /// 请求获取AVAssetExportSession
  208. - (PHImageRequestID)requestAVAssetExportSessionStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  209. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  210. success:(HXModelAVExportSessionSuccessBlock _Nullable)success
  211. failed:(HXModelFailedBlock _Nullable)failed;
  212. /// 请求获取AVPlayerItem
  213. - (PHImageRequestID)requestAVPlayerItemStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  214. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  215. success:(HXModelAVPlayerItemSuccessBlock _Nullable)success
  216. failed:(HXModelFailedBlock _Nullable)failed;
  217. /// 导出视频
  218. /// @param presetName 视频质量,为空时默认 AVAssetExportPresetMediumQuality
  219. /// @param startRequestICloud 准备开始下载iCloud上的视频,如果视频是iCloud的视频则会先下载
  220. /// @param iCloudProgressHandler iCloud下载进度
  221. /// @param exportProgressHandler 视频导出进度
  222. - (void)exportVideoWithPresetName:(NSString * _Nullable)presetName
  223. startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
  224. iCloudProgressHandler:(HXModelProgressHandler _Nullable)iCloudProgressHandler
  225. exportProgressHandler:(HXModelExportVideoProgressHandler _Nullable)exportProgressHandler
  226. success:(HXModelExportVideoSuccessBlock _Nullable)success
  227. failed:(HXModelFailedBlock _Nullable)failed;
  228. /// 获取imagePath
  229. /// 本地图片和网络图片会获取不到,只针对有PHAsset
  230. /// @return 请求的id,可用于取消请求 [self.asset cancelContentEditingInputRequest:(PHContentEditingInputRequestID)];
  231. /// @param startRequestICloud 开始下载iCloud上的视频,如果视频是iCloud的视频则会先下载
  232. /// @param progressHandler iCloud下载进度
  233. - (PHContentEditingInputRequestID)requestImageURLStartRequestICloud:(void (^ _Nullable)(
  234. PHContentEditingInputRequestID iCloudRequestId,
  235. HXPhotoModel * _Nullable model)
  236. )startRequestICloud
  237. progressHandler:(HXModelProgressHandler _Nullable)progressHandler
  238. success:(HXModelImageURLSuccessBlock _Nullable)success
  239. failed:(HXModelFailedBlock _Nullable)failed;
  240. /// 获取Livephoto里的图片和视频地址
  241. - (void)requestLivePhotoAssetsWithSuccess:(HXModelLivePhotoAssetsSuccessBlock _Nullable)success
  242. failed:(HXModelFailedBlock _Nullable)failed;
  243. /// 获取本地图片的URL,内部会将image写入临时目录然后生成文件路径
  244. /// 不是本地图片的会走失败回调
  245. - (void)getCameraImageURLWithSuccess:(HXModelImageURLSuccessBlock _Nullable)success
  246. failed:(HXModelFailedBlock _Nullable)failed;
  247. /// 获取当前资源的image,包括本地/网络图片、视频
  248. /// 如果为视频则为视频封面
  249. - (void)getImageWithSuccess:(HXModelImageSuccessBlock _Nullable)success
  250. failed:(HXModelFailedBlock _Nullable)failed;
  251. /// 获取当前资源的URL,包括本地/网络图片、视频
  252. /// 此方法导出手机里的视频质量为中等质量
  253. - (void)getAssetURLWithSuccess:(HXModelURLHandler _Nullable)success
  254. failed:(HXModelFailedBlock _Nullable)failed;
  255. /// 获取当前资源的URL,包括本地/网络图片、视频
  256. /// @param presetName 视频质量,为空的话默认 AVAssetExportPresetMediumQuality
  257. - (void)getAssetURLWithVideoPresetName:(NSString * _Nullable)presetName
  258. success:(HXModelURLHandler _Nullable)success
  259. failed:(HXModelFailedBlock _Nullable)failed;
  260. /// 获取原视频地址
  261. - (void)getVideoURLWithSuccess:(HXModelURLHandler _Nullable)success
  262. failed:(HXModelFailedBlock _Nullable)failed;
  263. /// 获取图片地址
  264. /// @param resultHandler 获取结果
  265. - (void)getImageURLWithResultHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel))resultHandler;
  266. /// 获取视频地址
  267. /// @param exportPreset 导出的视频分辨率, HXVideoExportPresetRatio_Original 为获取原始视频
  268. /// @param videoQuality 导出的视频质量 [1-10]
  269. /// @param resultHandler 导出结果
  270. - (void)getVideoURLWithExportPreset:(HXVideoExportPreset)exportPreset
  271. videoQuality:(NSInteger)videoQuality
  272. resultHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel))resultHandler;
  273. @property (assign, nonatomic) CGFloat previewContentOffsetX;
  274. @end