全部产品

图片上传

更新时间:2019-09-09 15:08:57

iOS 多媒体组件支持图片上传,并支持在图片上传过程中对图片进行压缩处理,以减少流量消耗。

上传方式

图片组件支持以下两种上传方式:

直接上传

直接上传图片相关的对象。支持 NSData、UIImage、ALAsset 等对象的上传。

  1. - (NSString *)uploadWithImage:(UIImage *)image request:(APImageUploadRequest *)uploadRequest;
  2. - (NSString *)uploadWithImageData:(NSData *)imageData request:(APImageUploadRequest *)uploadRequest;
  3. - (NSString *)uploadWithALAsset:(ALAsset *)asset request:(APImageUploadRequest *)uploadRequest;

先生成 local ID,再根据 local ID 上传

先调用接口生成 local ID,然后再根据 local ID 上传。

上传图片前,先做裁切和压缩处理,将图片存储在缓存中并返回 local ID,您可通过该 local ID 在缓存中查找对应的图片,也可以通过 local ID 直接上传图片到服务器端。

支持 NSData、UIImage、PHAsset、ALAsset 等对象的上传。

  • 生成 local ID

    1. - (NSString *)getLocalIdWithImage:(UIImage*)image request:(APImageUploadRequest*)request;
    2. /**
    3. 根据上传参数和 ALAseet 或者 PHAsset 生成 local ID
    4. @param asset ALAsset 或者 PHAsset
    5. @param request 上传的参数,无需设置 block
    6. @return local ID
    7. */
    8. - (NSString *)getLocalIdWithAsset:(id)asset request:(APImageUploadRequest *)request;
    9. - (NSString *)getLocalIdWithImageData:(NSData *)imageData request:(APImageUploadRequest *)request;
  • 根据 local ID 上传

    1. /**
    2. 根据 local ID上传
    3. @param localId localID
    4. @param uploadRequest 上传参数。compress 和 isPublic 参数以生成 localID 的设置为准
    5. @return local ID
    6. */
    7. - (NSString *)uploadRetryWithLocalId:(NSString *)localId request:(APImageUploadRequest *)uploadRequest;

建议使用 根据 local ID 上传 的方式,该方式主要有如下优势:

  • 上传失败后,重新上传时不需要重新压缩图片信息,local ID 对应的图片信息已经存在缓存中,直接可以查找到,避免了重复的压缩过程。
  • 可以根据 local ID 直接去获取图片信息并显示。对于一些需要在上传前就显示图片信息的场景,第一种方式比较难做到。

压缩级别

现在相机拍摄的照片分辨率和清晰度都很高,在手机上显示的时候,如无特殊要求,不需要那么高的清晰度和分辨率,太高的清晰度和分辨率往往意味着较大的流量消耗,较长的下载时间和较大的渲染内存,一般在上传之前,往往需要对图片处理:

现在相机拍摄的照片分辨率和清晰度都很高,在手机上显示图片的时候,如无特殊要求,不需要那么高的清晰度和分辨率。图片的清晰度和分辨率越高,则流量消耗越大,下载时间越长,渲染内存越大。一般在上传之前,往往需要对图片进行处理:

  • 对图片进行缩放,缩小图片的分辨率。
  • 适当的降低图片清晰度,在清晰度和流量之间取得平衡。

多媒体图片上传接口支持压缩级别设置:

  1. //图片压缩等级
  2. typedef enum : NSUInteger {
  3. ImageCompressQualityLow, //低质量压缩 压缩比最大
  4. ImageCompressQualityMid, //中质量压缩 压缩比中等
  5. ImageCompressQualityHigh, //高质量压缩 压缩比最小
  6. ImageCompressNone, //不压缩
  7. ImagecompressDefault, //默认压缩,根据网络情况进行低、中、高进行压缩
  8. } ImageCompressQualityLevelEnum;

除了 ImageCompressNone 外,其他参数都会对上传的图片的分辨率和清晰度做适当的压缩。

说明:

  • 压缩后,图片的二进制大小会大大降低,对于手机拍摄的照片,清晰度略有下降。
  • 对于大于 1280P 的图片,会压缩成 1280P 的分辨率;对小于 1280P 的图片,保留原始的分辨率。1280P 是当前的阈值,不排除以后会更改的可能。
  • 不再保留 exif 信息,如地理位置之类的信息。
  • PNG 图片压缩后会变成 JPG,透明度信息会丢失。
  • GIF 图片压缩后只有首帧图片。

上传参数类 APImageUploadRequest

具体类定义如下:

  1. @interface APImageUploadRequest : APBaseUploadRequest
  2. /**
  3. 压缩级别
  4. */
  5. @property (nonatomic, assign) ImageCompressQualityLevelEnum compress;
  6. /**
  7. 上传完成后的回调,只有在上传成功后才会回调,生成 local ID 的接口不会回调
  8. */
  9. @property (nonatomic, copy) APImageUploadRequestCompletion complete;
  10. /**
  11. 上传的图片是否到公有域,默认值为 NO,如果存在 app 外访问该图片的场景(不需要鉴权),可以考虑设置此值
  12. */
  13. @property (nonatomic, assign) BOOL isPublic;
  14. /**
  15. 对于 GIF 是否只上传首帧图,默认为 YES;只在 compress 为 ImageCompressNone 时生效,对于其他的压缩级别,全部是上传首帧图
  16. */
  17. @property (nonatomic, assign) BOOL thumbnailWithGifWhenCompressNone;
  18. - (BOOL)isValid;
  19. @end