• ALAsset 循环获取图片(Assets Library Framework)


    Assets Library Framework 可以用来做iOS上的多选器,选照片视频啥的啦就不介绍了。
     
    目前的项目有点类似dropbox,可以选择设备内的照片然后帮你上传文件,使用了Assets Library Framework,背景如此。
     
     
    ALAsset可以看成是一个你选择的文件的包装类,从中可以取到一个叫做ALAssetPresentation的对象(defaultRepresentation),然后如果是图片的话里面可以得到全屏图、全尺寸图、metadata、size等等有用的信息。
     
    问题出现了:当用户使用iPhone/iPad内置的Photos应用修改了照片保存后,使用Assets Library Framework选择的时候看到的是修改后的缩略图OK;defaultPresentation里面的全屏图(fullScreenImage)也是 修改后的OK;但是,但是!全尺寸图(fullResolutionImage)是未修改的图,Asset给出的文件url如果你直接上传,大部分看图软 件打开会显示原图!(起码我们项目对接的server端生成给我们的缩略图是原图的缩略图,下载这个图直接用imageView看也是原图),坑爹啊!
     
    回去Photos应用打开这个图片进入编辑状态可以看到有个按钮亮了,叫做”Revert to Original“,点一下图片还原了。
     
    原理是Photos对图片的处理,并没有真的保存一个新的图片,而是将处理通过一个叫做”AdjustmentXMP“的属性写进原图的metadata中了。
     
     
     
    这可如何是好?经过研究得出了下面的解决方案,希望对不知道的人有所帮助:
     
    1. 判断asset是图片
     
    2. 取到asset中的defaultRepresentation(以下简称rep)
     
    3. 取到rep中metadata的”AdjustmentXMP“(以下简称adj)
     
    4. 如果有adj,将adj变成一组CIFilter
     
    5. 取到原图fullResolutionImage(以下简称img)
     
    6. 使用CIFilter逐一”加工“img,最后生成的就是想要的图片了
     
    7. do whatever you want... 比如我们项目是把生成的图片存成临时文件然后上传
     
     
     
    示例代码如下(asset是Assets Library Framework返回的ALAsset对象):
     
     // 处理被iOS自带Photos修改过的图片
     if ([[asset valueForProperty:ALAssetPropertyType]
        isEqualToString:ALAssetTypePhoto]) {
              ALAssetRepresentation *rep = [asset defaultRepresentation];
              NSString *adj = [rep metadata][@"AdjustmentXMP"];
              if (adj) {
                  CGImageRef fullResImage = [rep fullResolutionImage];
                  NSData *xmlData = [adj dataUsingEncoding:NSUTF8StringEncoding];
                  CIImage *image = [CIImage imageWithCGImage:fullResImage];
                 NSError *error = nil;
                 NSArray *filters = [CIFilter filterArrayFromSerializedXMP:xmlData
                                                          inputImageExtent:[image extent]
                                                                     error:&error];
                 CIContext *context = [CIContext contextWithOptions:nil];
                 if (filters && !error) {
                     for (CIFilter *filter in filters) {
                         [filter setValue:image forKey:kCIInputImageKey];
                         image = [filter outputImage];
                     }
                     fullResImage = [context createCGImage:image fromRect:[image extent]];
                     UIImage *result = [UIImage imageWithCGImage:fullResImage
                                                           scale:[rep scale]
                                                     orientation:(UIImageOrientation)[rep orientation]];
                     // do whatever you want with the result image then.
                 }
             }
         }
  • 相关阅读:
    安全工具
    WebRTC媒体协商及实践
    流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
    基于 WebRTC 技术的实时通信服务开发实践
    实时音视频互动系列(下):基于 WebRTC 技术的实战解析
    WebRTC基于浏览器的开发
    webRtc+websocket多人视频通话
    Android IOS WebRTC 音视频开发总结(四九) ffmpeg介绍
    Android IOS WebRTC 音视频开发总结(二五) webrtc优秀资源汇总
    The 3n + 1 problem UVA 100
  • 原文地址:https://www.cnblogs.com/allanliu/p/4203474.html
Copyright © 2020-2023  润新知