背景
本文而言,保存图片至相册功能相信基本上在开发中都能遇到,但是你在保存你原图大小至系统相册时,系统会主动的进行你图片的缩放和拉伸来适应它图片的展示,好吧,你老大,按你的来,当你按照它屏幕大小设置图片大小时,它还是会冷不及防的给你适应。 主要通过两部分介绍。一是简单介绍保存图片至相册的方法;二是为了讲解iOS保存图片至相册时系统相册对图片展示问题的解决。
保存图像至相册方法
iOS 目前有三种方法将图片保存至相册:
- UIImageWriteToSavedPhotosAlbum();
- AssetsLibrary框架;
- Photos框架;
UIImageWriteToSavedPhotosAlbum()
最简单的实现方式,运用c语言函数:
UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo)
简单介绍下函数入参:
- image: 保存至相册的图片;
- completionTarget: 写入图片至相册完成后接收回调对象;
- completionSelector: 写入图片至相册完成后所执行回调方法;
- contextInfo: 写入完成后原封不动地传回到回调方法的contextInfo参数中;
AssetsLibrary框架 (iOS 4.0被引入、iOS 9.0被废弃)
1.导入#import <AssetsLibrary/AssetsLibrary.h>库
2.调用 - (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
简单介绍下函数入参:
- imageRef: 保存至相册的图片的CGImageRef对象;
- metadata: 图片属性;
- completionBlock: 写入图片至相册完成后所执行回调方法;
Photos框架
1.导入#import <Photos/Photos.h>库
2.创建PHPhotoLibrary实例对象
3.- (void)performChanges:(dispatch_block_t)changeBlock completionHandler:(nullable void(^)(BOOL success, NSError *__nullable error))completionHandler //创建一个串行队列进行相册操作。
主要涉及PHPhotoLibrary 、PHAssetChangeRequest类,PHPhotoLibrary类创建一个串行队列,PHAssetChangeRequest类传入一个图片对象实现保存至相册
相册图片展示问题
由上三种方式进行图片保存后,原本的图片大小保存至相册后可能并不是你想要展示的那样,因为系统相册会对图片大小根据屏幕宽高进行等比缩放拉伸来展示,所以在保存至相册后展示的图片大小会出现和原图片大小不一致的情况。面对这样的情况,我们一般会自己进行图片缩放,不将缩放交由系统。
原图存入相册
如上图原图存入相册,系统会自动拉伸出现展示不全问题(如下):
图片缩放
原图保存和想象的并不太一样,那就自己进行缩放,让系统没得缩。
通过依照屏幕大小创建画布
UIGraphicsBeginImageContext([UIScreen mainScreen].bounds.size);
再在相应的位置绘制图片,使图片居中展示。
但是这种方式在系统相册展示的图片就会出现白边间隔,存入的图片和想保存入相册的图片不一致。