• ios ALAssetsLibrary简单的使用


    关于ALAssetsLibrary的简单使用有两个方面:

    第一:存储图片/视频方法如下:

    // With a UIImage, the API user can use -[UIImage CGImage] to get a CGImageRef, and cast -[UIImage imageOrientation] to ALAssetOrientation.
    - (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
    //
    The API user will have to specify the orientation key in the metadata dictionary to preserve the orientation of the image - (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock // If there is a conflict between the metadata in the image data and the metadata dictionary, the image data metadata values will be overwritten - (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock // - (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock

    简单说明:

    orientation为储存图片时的具体操作:

    typedef NS_ENUM(NSInteger, ALAssetOrientation) {
        ALAssetOrientationUp                 // default orientation 默认方向
        ALAssetOrientationDown             // 180 deg rotation
        ALAssetOrientationLeft              // 90 deg CCW
        ALAssetOrientationRight               // 90 deg CW
        ALAssetOrientationUpMirrored          // as above but image mirrored along other axis. horizontal flip 镜像
        ALAssetOrientationDownMirrored      // horizontal flip
        ALAssetOrientationLeftMirrored        // vertical flip
        ALAssetOrientationRightMirrored      // vertical flip
    }

    metadata为元数据内容,如果内容和图片内部冲突,将覆盖操作;

    第二:获取图片/视频

    以下方法中是异步获取相册内容:

    // Get the list of groups that match the given types. Multiple types can be ORed together. The results are passed one by one to the caller by executing the enumeration block.
    // When the enumeration is done, 'enumerationBlock' will be called with group set to nil.
    // When groups are enumerated, the user may be asked to confirm the application's access to the data. If the user denies access to the application or if no application is allowed to access the data, the failure block will be called.
    // If the data is currently unavailable, the failure block will be called.
    - (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock 

    ALAssetsGroupType参数解析如下:

    ALASSetsGroupType: 类型 ALAssetsGroupLibrary:从iTunes 来的相册内容。

    ALAssetsGroupAlbum:设备自身产生或从iTunes同步来的照片,但是不包括照片流跟分享流 中的照片。(例如从各个软件中保存下来的图片)

    ALAssetsGroupEvent 相机接口事件产生的相册
    ALAssetsGroupFaces 脸部相册(具体不清楚)
    ALAssetsGroupSavedPhotos 相机胶卷照片
    ALAssetsGroupPhotoStream 照片流
    ALAssetsGroupAll 除了ALAssetsGroupLibrary上面所的内容。

    获得组别后 对组别进行操作:

    //组封面
    - (CGImageRef)posterImage

    //组别个数

    - (NSInteger)numberOfAssets
    //约束
    - (void)setAssetsFilter:(ALAssetsFilter *)filter
    //枚举
    - (void)enumerateAssetsUsingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock - (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock - (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock

    参数说明:

    ALAssetsFilter:

    + (ALAssetsFilter *)allPhotos;
    + (ALAssetsFilter *)allVideos;
    + (ALAssetsFilter *)allAssets;

    NSEnumerationOptions:正反排序

    NSIndexSet:组中第N个

    对于ALAsset的说明:

    方法:

      - (CGImageRef)thumbnail

      - (CGImageRef)aspectRatioThumbnail

      - (ALAssetRepresentation *)defaultRepresentation

      Representation属性:

      – CGImageWithOptions:

      – fullResolutionImage(完全分辨率的图片)

      – fullScreenImage(满屏的图片

      - (id)valueForProperty:(NSString *)property

    property:

        1.ALAssetPropertyType 资源的类型(照片,视频)

          2.ALAssetPropertyLocation 资源地理位置(无位置信息返回null)

          3.ALAssetPropertyDuation 播放时长(照片返回ALErorInvalidProperty)

          4.ALAssetPropertyOrientation 方向(共有8个方向,参见:ALAssetOrientation)

          5.ALAssetPropertyDate 拍摄时间(包含了年与日时分秒)

          6.ALAssetPropertyRepresentations 描述(打印看了下,只有带后缀的名称)

          7.ALAssetPropertyURLs(返回一个字典,键值分别是文件名和文件的url)

          8.ALAssetPropertyAssetURL 文件的url )

        editable  property(指示资源是否可以编辑,只读属性)

        originalAsset  property(原始资源。若没有保存修改后资源,则原始资源为nil)

    我的代码:

     

    -(void)getAllPicturesAndVideo
    {
        //失败控制
        ALAssetsLibraryAccessFailureBlock failureblock =
        ^(NSError *myerror)
        {
            NSLog(@"相册访问失败 =%@", [myerror localizedDescription]);
            if ([myerror.localizedDescription rangeOfString:@"Global denied access"].location!=NSNotFound) {
                NSLog(@"无法访问相册.请在'设置->定位服务'设置为打开状态.");
            }else{
                NSLog(@"相册访问失败.");
            }
            return ;
        };
        mutableArray =[[NSMutableArray alloc]init];
      //成功 ALAssetsLibraryGroupsEnumerationResultsBlock libraryGroupsEnumeration
    =
      ^(ALAssetsGroup* group,BOOL* stop){
       //说明枚举结束用group==nil标识
    if (group!=nil) { [mutableArray addObject:group]; } else { NSLog(@"%ld",mutableArray.count);
             //更新UI } }; [[ViewController defaultAssetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:libraryGroupsEnumeration failureBlock:failureblock]; }

     

    //从组别中获取第index个数据
    [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:index] options:NSEnumerationConcurrent usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { //图片 if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { UIImage *image=[UIImage imageWithCGImage:[result aspectRatioThumbnail]];
             }
         //视频
         else if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]){ //UIImage *image=[UIImage imageWithCGImage:[result aspectRatioThumbnail]];
           [[WHViewController defaultAssetsLibrary] assetForURL:[result valueForProperty:ALAssetPropertyAssetURL] resultBlock:^(ALAsset *asset) {
                    //写入沙盒
                    [self handleWrittenFile:asset];
                } failureBlock:^(NSError *error) {
                    //
                }];
    } }];
    //文件写入方法
    -(void)handleWrittenFile:(ALAsset*) videoAsset
    {
        NSString *DocRoot = [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
        NSString *tempFile = [NSString stringWithFormat:@"%@/VideoFileName.mov",DocRoot];
        ALAssetRepresentation *rep = [videoAsset defaultRepresentation];
        NSUInteger size = [rep size];
        const int bufferSize = 65636;
        NSLog(@"written to : %@", tempFile);
        FILE *f = fopen([tempFile cStringUsingEncoding:1], "wb+");
        if (f==NULL) {
            return;
        }
        Byte *buffer =(Byte*)malloc(bufferSize);
        NSInteger read =0, offset = 0;
        NSError *error;
        if (size != 0) {
            do {
                read = [rep getBytes:buffer
                          fromOffset:offset
                              length:bufferSize
                               error:&error];
                fwrite(buffer, sizeof(char), read, f);
                offset += read;
                NSLog(@"read : %ld   total : %ld",read, offset);
            } while (read != 0);
        }
        fclose(f);
        free(buffer);
    }

     

     

  • 相关阅读:
    Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案
    vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
    CentOS7.2部署FTP
    Apache与Nginx的优缺点比较
    MySQL存储引擎--MyISAM与InnoDB区别
    CentOS 7下搭建配置SVN服务器
    Remi 安装源
    tmpx75 I2C 温度传感器驱动程序添加
    QT 5.7.0 交叉编译记录
    am335x SGX 移植
  • 原文地址:https://www.cnblogs.com/chaochaobuhuifei55/p/5413827.html
Copyright © 2020-2023  润新知