Используя ALAssetsLibrary и ALAsset вынуть изображение как NSData - PullRequest
18 голосов
/ 12 декабря 2011

Я хочу извлечь изображение, используя 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 голосов
/ 12 декабря 2011
        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]);
        }];
0 голосов
/ 10 июля 2014

Используя этот код:

+ (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;
}
0 голосов
/ 02 ноября 2012
UIImage * selImage = [UIImage imageWithCGImage:[asset thumbnail]];       
NSData *baseImage=UIImagePNGRepresentation(selImage);
...