zoukankan      html  css  js  c++  java
  • iOS开发之获取系统相册中的图片与视频(内带url转换)

    @话不多说,直接上代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    #import   // 必须导入
     
    // 照片原图路径
    #define KOriginalPhotoImagePath  
    [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@OriginalPhotoImages]
     
    // 视频URL路径
    #define KVideoUrlPath  
    [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@VideoURL]
     
    // caches路径
    #define KCachesPath  
    [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
     
    // MainViewController
    @interface MTHMainViewController ()
     
    @property (nonatomic,strong) MTHNextViewController *nextVC;
    @property (nonatomic,strong) NSMutableArray        *groupArrays;
    @property (nonatomic,strong) UIImageView           *litimgView;
     
    @end
     
    @implementation MTHMainViewController
     
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
     
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.navigationItem.title = @Demo;
        self.view.backgroundColor = [UIColor clearColor];
         
        // 初始化
        self.groupArrays = [NSMutableArray array];
         
        // 测试BarItem
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@测试 style:UIBarButtonItemStylePlain target:self action:@selector(testRun)];
         
        // 测试手势
        UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didClickPanGestureRecognizer:)];
        [self.navigationController.view addGestureRecognizer:panRecognizer];
         
        // 图片或者视频的缩略图显示
        self.litimgView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 120, 120)];
        [self.view addSubview:_litimgView];
    }
     
     
    - (void)testRun
    {
        __weak MTHMainViewController *weakSelf = self;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {
                if (group != nil) {
                    [weakSelf.groupArrays addObject:group];
                } else {
                    [weakSelf.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 = %lld,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];
        });
    }
    </assetslibrary>

    @但是:

    按照上面方法直接取出来的路径是无法传输的,必须自己转化成NSData对象重新写入沙盒路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    // 将原始图片的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];
            }
        });
  • 相关阅读:
    编译器与解释器的区别
    django中两张表之间有多个ForeignKey的问题
    23python装饰器的使用
    24.python传递可变长的非关键参数和关键参数
    如何让django的admin组件显示为中文
    22迭代器和iter()函数
    如何让django中的admin组件的表的字段显示为中文
    django模板中关于过滤器的使用
    django的认证支持模块
    python如何实现——日期加上天数的处理方法
  • 原文地址:https://www.cnblogs.com/lee4519/p/4433003.html
Copyright © 2011-2022 走看看