美文网首页
Xcode_读取本地图片库/视频库

Xcode_读取本地图片库/视频库

作者: 陈胜华 | 来源:发表于2016-06-21 13:26 被阅读428次
    //读取相册里中的视频/图片
    - (void)efReadLibraryVideoOrPhoto{
        
        /**需要导入
         #import <AssetsLibrary/AssetsLibrary.h>
         #import <MobileCoreServices/UTCoreTypes.h>
         
         */
        __block NSMutableArray *groupArrays = [[NSMutableArray alloc]init];
        
        //__weak __typeof(&*self) weakSelf = self;
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {
                if (group != nil) {
                    [groupArrays addObject:group];
                } else {
                    [groupArrays enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                        [obj enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                            if ([result thumbnail] != nil) {
                                // 照片
                                if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]){
                                    
                                    NSDate *date= [result valueForProperty:ALAssetPropertyDate];
                                    UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
                                    NSString *fileName = [[result defaultRepresentation] filename];
                                    NSURL *url = [[result defaultRepresentation] url];
                                    int64_t fileSize = [[result defaultRepresentation] size];
                                    
                                    NSLog(@"date = %@",date);
                                    NSLog(@"fileName = %@",fileName);
                                    NSLog(@"url = %@",url);
                                    NSLog(@"fileSize = %ld",fileSize);
                                    
                                    // UI的更新记得放在主线程,要不然等子线程排队过来都不知道什么年代了,会很慢的
                                    dispatch_async(dispatch_get_main_queue(), ^{
                                        //self.litimgView.image = image;
                                    });
                                } else if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo] ){
                                    // 视频
                                    // 和图片方法类似
                                }
                            }
                        }];
                    }];
                    
                }
            };
            
            ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){
                
                NSString *errorMessage = nil;
                
                switch ([error code]) {
                    case ALAssetsLibraryAccessUserDeniedError:
                    case ALAssetsLibraryAccessGloballyDeniedError:
                        errorMessage = @"用户拒绝访问相册,请在<隐私>中开启";
                        break;
                        
                    default:
                        errorMessage = @"Reason unknown";
                        break;
                }
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"错误,无法访问!"
                                                                       message:errorMessage
                                                                      delegate:self
                                                             cancelButtonTitle:@"确定"
                                                             otherButtonTitles:nil, nil];
                    [alertView show];
                });
            };
            
            
            ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]  init];
            [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
                                         usingBlock:listGroupBlock failureBlock:failureBlock];
        });
    }
    
    //@但是:
    
    //按照上面方法直接取出来的路径是无法传输的,必须自己转化成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 const *cvideoPath = [videoPath UTF8String];
                    FILE *file = fopen(cvideoPath, a+);
                    if (file) {
                        const int bufferSize = 1024 * 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];
            }
        });
    }
    

    相关文章

      网友评论

          本文标题:Xcode_读取本地图片库/视频库

          本文链接:https://www.haomeiwen.com/subject/dlrgdttx.html