Использование ALAssetsLibrary и ALAsset извлекает изображение как NSData

Я хочу извлечь изображение с помощью 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.

Пожалуйста помоги.


person Shishir Shetty    schedule 12.12.2011    source источник


Ответы (2)


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

+ (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;
}
person Yong Li    schedule 10.07.2014

person    schedule
comment
Спасибо за ваше замечательное предложение. Но есть ли способ сжать изображение? Прежде чем использовать его как NSData. - person Shishir Shetty; 13.12.2011
comment
Если я правильно понимаю, изображение уже будет сжато. Презентация по умолчанию, вероятно, будет в формате jpeg или png. - person HeikoG; 15.12.2011
comment
У меня проблема с этой техникой при одновременном импорте нескольких ALAssets, кажется, что буфер повторно используется для следующего элемента. - person Nicolas Manzini; 20.12.2013
comment
этот ответ просто фантастический! спасибо за код! Метод CGImage также требует значительного объема памяти по сравнению с этим методом. - person dreampowder; 10.04.2014
comment
Я использовал этот код для получения GIF-изображения, это работает, но неправильно, состояние анимации не остается с изображением GIF, и его размер сжимается, любой другой вариант будет полезен. - person Pankaj Bhardwaj; 04.07.2015
comment
@PankajBhardwaj вам когда-нибудь удавалось получить гифку от alasset? - person maddy; 16.07.2015
comment
Нет @Alok не gif Я получил PNG и JPG, даже я пытался сохранить в каталоге документов, но все равно это просто изображение без анимации. - person Pankaj Bhardwaj; 16.07.2015
comment
я смог сделать это успешно. поделится кодом, когда на моем Mac. - person maddy; 17.07.2015