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];
            }
        });
  • 相关阅读:
    名信片定做网站
    [置顶] 数据库开发常识
    <IMG>中UserMap的用法
    阿斯钢iojeg9uhweu9erhpu9hyw49
    慎得慌二u赫然共和任务i个屁
    阿斯钢iojeg9uhw8uhy平
    2014校园招聘笔、面经历总结---华为双选会
    PDCA模型的学习
    阿斯钢 弇7人后偶尔一个味5而已
    【HTML】让<pre>标签文本自动换行
  • 原文地址:https://www.cnblogs.com/lee4519/p/4433003.html
Copyright © 2011-2022 走看看