• 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];
            }
        });
  • 相关阅读:
    MySQL DNS反查导致连接缓慢
    重写官方TodoList,对于初学react+redux的人来说,很有好处
    第一个博客试一试
    需求分析
    原来==的优先级比&高 (转自地址为http://blog.163.com/cynicly@126/blog/static/1206105820103893715302/的网易博客)
    E: 无法获得锁 /var/lib/apt/lists/lock open (11 Resource temporarily unavailable)
    我的博客园终于开通啦!
    (转自CSDN日新为道的专栏)printf的格式控制符,在CSDN看到的,转在这里
    qrc_image.cpp未找到
    QT打开保存的html文件无法显示图片
  • 原文地址:https://www.cnblogs.com/lee4519/p/4433003.html
Copyright © 2020-2023  润新知