4

我可以通过 ALAssetsLibrary 从照片库中获取图像:

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop){
        if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
            // Copy the photo image to the `/Documents` directory of this App here

        }
    };

    void (^assetGroupEnumerator )(ALAssetsGroup*, BOOL*) = ^(ALAssetsGroup *group, BOOL *stop){
        if (group != nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }
    };
    // fetch
    ALAssetsLibrary *library = [ALAssetsLibrary new];
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:^(NSError *error) {
        NSLog(@"failed");
    }];

我想将特定图像复制到本地目录 ( App_home/Documents),但我不知道如何通过处理 ALAsset 对象来准确完成这项工作。

4

3 回答 3

5

尝试使用以下代码

ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:YourURL resultBlock:^(ALAsset *asset) 
    {
       ALAssetRepresentation *rep = [asset defaultRepresentation];
       Byte *buffer = (Byte*)malloc(rep.size);
       NSUInteger buffered = [rep getBytes:buffer fromOffset:0 length:rep.size error:nil];
       NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want
      [data writeToFile:photoFile atomically:YES];//you can save image later
   }
    failureBlock:^(NSError *err) 
    {
      NSLog(@"Error: %@",[err localizedDescription]);

    }
];

在文档目录中获取图片

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *newPath = [documentsDirectory stringByAppendingPathComponent:@"Your_Image_Name"];
UIImage *myImg = [UIImage imageWithContentsOfFile:newPath]
于 2013-09-11T06:33:45.420 回答
0

您可以通过以下实现获取照片原始二进制文件并保存到目标文件。

+ (NSData *)photoAssetRawData:(ALAsset *)photoAsset error:(NSError **)error {
    ALAssetRepresentation *rep = photoAsset.defaultRepresentation;
    NSMutableData *data = [NSMutableData new];
    long long offset = 0;
    uint8_t dataBuffer[PHOTO_READ_CHUNK_SIZE];
    NSError *internalError;
    do {
        NSUInteger readByteLength = [rep getBytes:dataBuffer fromOffset:offset length:sizeof(dataBuffer) error:&internalError];
        if(internalError != nil) {
            if(error != NULL) {
                *error = internalError;
            }
            return nil;
        }
        offset += readByteLength;
        [data appendBytes:(void*)dataBuffer length:readByteLength];
    }
    while (offset < rep.size);
    return data;
}

必须注意的一件事是,此原始数据未应用任何过滤器添加的 iOS 默认图库应用程序,如果您希望应用这些过滤器,您应该从 [ALAssetRepresentation 元数据] 获取这些 XMP 喜欢的过滤器并使用 [CIFilter filterArrayFromSerializedXMP:inputImageExtent:error] 创建过滤器:],然后将它们应用于全分辨率图像,最后将此处理后的图像保存为 JPEG 或 PNG 文件。

下面显示了如何应用这些过滤器。

+ (CGImageRef)applyXMPFilter:(ALAsset *)asset{
    ALAssetRepresentation *rep = [asset defaultRepresentation];
    CGImageRef imageRef = [rep fullResolutionImage];
    NSString *adjustmentXMP;
    NSData *adjustmentXMPData;
    NSError *__autoreleasing error = nil;
    NSArray *filters=nil;
    CGRect extend = CGRectZero;
    //add filter to image
    ALAssetRepresentation *representation = asset.defaultRepresentation;
    adjustmentXMP = [representation.metadata objectForKey:@"AdjustmentXMP"];
    adjustmentXMPData = [adjustmentXMP dataUsingEncoding:NSUTF8StringEncoding];
    extend.size = representation.dimensions;
    filters = [CIFilter filterArrayFromSerializedXMP:adjustmentXMPData inputImageExtent:extend error:&error];
    if(filters)
    {
        CIImage *image = [CIImage imageWithCGImage:imageRef];
        CIContext *context = [CIContext contextWithOptions:nil];
        for (CIFilter *filter in filters)
        {
            [filter setValue:image forKey:kCIInputImageKey];
            image = [filter outputImage];
        }
        imageRef = [context createCGImage:image fromRect:image.extent];
    }
    return imageRef;
}
于 2014-01-03T07:10:52.703 回答
0

它可能对你有帮助。在此 outputFileURL 的类型为 NSURL

   NSData *videoData = [NSData dataWithContentsOfURL:outputFileURL];

  [data writeToFile:destinationPath atomically:YES];//you can save image later
于 2013-09-11T06:51:44.893 回答