使用ALAssetsLibrary和ALAsset将图像作为NSData提取

18

我希望使用ALAssetsLibrary和ALAsset直接提取图像并以NSData对象的形式返回。

使用NSURL,我按以下方式获取图像。

NSURL *referenceURL =newURL;
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset)
{
     UIImage  *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
}

现在我们将图像作为UIImage处理,但我需要直接将图像作为NSData处理。

我希望这样做是因为(我已经阅读过)一旦您以UIImage形式获取图像,那么我们将失去图像的所有EXIF详细信息。

这就是我希望直接提取图像作为NSData的原因,而不是通过这种方式进行处理。

NSData *webUploadData=UIImageJPEGRepresentation(copyOfOriginalImage, 0.5);

这一步导致我失去了所有的EXIF细节。

请帮忙。

3个回答

33
        ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
        [assetLibrary assetForURL:[[self.imagedata objectAtIndex:i] resultBlock:^(ALAsset *asset) 
        {
            ALAssetRepresentation *rep = [asset defaultRepresentation];
            Byte *buffer = (Byte*)malloc(rep.size);
            NSUInteger buffered = [rep getBytes:buffer fromOffset:0.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]);
        }];

1
谢谢你的精彩建议。但是,在将其用作NSData之前,我是否有压缩图像的方法? - Shishir Shetty
如果我理解正确,图像将已经被压缩。默认的呈现格式可能是jpeg或png。 - HeikoG
2
我在使用这种技术同时导入多个ALAssets时遇到了问题,似乎缓冲区被重用于下一个项目。 - Nicolas Manzini
我使用了这段代码来获取GIF图像,它能够运行但不是很完美,动画状态不能与GIF图像保持一致,并且其大小会被压缩。如果有其他选项则会更有帮助。 - Pankaj Bhardwaj
1
不是 GIF,是 PNG 和 JPG。我甚至尝试将其保存在文档目录中,但它仍然只是一张没有动画的图片。 - Pankaj Bhardwaj
显示剩余3条评论

0

使用以下代码:

+ (BOOL)exportDataToURL:(NSString *)filePath error:(NSError **)error andAsset:(ALAsset *)asset
{
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];

    if (!handle)
        return NO;

    static const NSUInteger BufferSize = 1024 * 1024;

    ALAssetRepresentation *rep = [asset defaultRepresentation];
    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));
    NSUInteger offset = 0, bytesRead = 0;

    do {
        @try {
            bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:error];
            [handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];
            offset += bytesRead;
        } @catch(NSException *exception) {
            free(buffer);

            return NO;
        }
    } while (bytesRead > 0);

    free(buffer);
    return YES;
}

-1
UIImage * selImage = [UIImage imageWithCGImage:[asset thumbnail]];       
NSData *baseImage=UIImagePNGRepresentation(selImage);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接