iOS开发之获取系统相册中的图片与视频教程(内带url转换)

2020-01-18 17:18:49丽君

iOS开发,获取系统相册视频,ios,获取系统相册图片
@但是:
按照上面方法直接取出来的路径是无法传输的,必须自己转化成NSData对象重新写入沙盒路径


   // 将原始图片的URL转化为NSData数据,写入沙盒 
- (void)imageWithUrl:(NSURL *)url withFileName:(NSString *)fileName 
{ 
  // 进这个方法的时候也应该加判断,如果已经转化了的就不要调用这个方法了 
  // 如何判断已经转化了,通过是否存在文件路径 
  ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 
  // 创建存放原始图的文件夹--->OriginalPhotoImages 
  NSFileManager * fileManager = [NSFileManager defaultManager]; 
  if (![fileManager fileExistsAtPath:KOriginalPhotoImagePath]) { 
    [fileManager createDirectoryAtPath:KOriginalPhotoImagePath withIntermediateDirectories:YES attributes:nil error:nil]; 
  } 
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    if (url) { 
      // 主要方法 
      [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { 
        ALAssetRepresentation *rep = [asset defaultRepresentation]; 
        Byte *buffer = (Byte*)malloc((unsigned long)rep.size); 
        NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:((unsigned long)rep.size) error:nil]; 
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 
        NSString * imagePath = [KOriginalPhotoImagePath stringByAppendingPathComponent:fileName]; 
        [data writeToFile:imagePath atomically:YES]; 
      } failureBlock:nil]; 
    } 
  }); 
} 
 
// 将原始视频的URL转化为NSData数据,写入沙盒 
- (void)videoWithUrl:(NSURL *)url withFileName:(NSString *)fileName 
{ 
  // 解析一下,为什么视频不像图片一样一次性开辟本身大小的内存写入? 
  // 想想,如果1个视频有1G多,难道直接开辟1G多的空间大小来写? 
  ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    if (url) { 
      [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { 
        ALAssetRepresentation *rep = [asset defaultRepresentation]; 
        NSString * videoPath = [KCachesPath stringByAppendingPathComponent:fileName]; 
        char constconst *cvideoPath = [videoPath UTF8String]; 
        FILEFILE *file = fopen(cvideoPath, "a+"); 
        if (file) { 
          const int bufferSize = 11024 * 1024; 
          // 初始化一个1M的buffer 
          Byte *buffer = (Byte*)malloc(bufferSize); 
          NSUInteger read = 0, offset = 0, written = 0; 
          NSError* err = nil; 
          if (rep.size != 0) 
          { 
            do { 
              read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err]; 
              written = fwrite(buffer, sizeof(char), read, file); 
              offset += read; 
            } while (read != 0 && !err);//没到结尾,没出错,ok继续 
          } 
          // 释放缓冲区,关闭文件 
          free(buffer); 
          buffer = NULL; 
          fclose(file); 
          file = NULL; 
        } 
      } failureBlock:nil]; 
    } 
  }); 
}