Как скопировать файл изображения из iOS Photo Library (ALAssetsLibrary) в локальный каталог приложения?

Я могу получить изображения из библиотеки фотографий через 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.

3 Solutions collect form web for “Как скопировать файл изображения из iOS Photo Library (ALAssetsLibrary) в локальный каталог приложения?”

Попробуйте следующий код

 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] 

Это может быть полезно для вас. В этом outputFileURL имеет тип NSURL

  NSData *videoData = [NSData dataWithContentsOfURL:outputFileURL]; [data writeToFile:destinationPath atomically:YES];//you can save image later 

Вы можете получить исходный двоичный файл с фотографией ниже и сохранить в целевой файл.

 + (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 по умолчанию. Если вы хотите, чтобы этот фильтр применялся, вы должны получить этот фильтр с поддержкой XMP из [ALAssetRepresentation metadata] и создать фильтры с помощью [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; } 
  • iOS: как прокрутить изображение с разбивкой на страницы
  • Вставка изображения в базу данных с использованием sqlite в xcode4.6
  • Как я могу программно добавить изображение внутри TListBoxItem?
  • React Native 0.26 Не найдено подходящего загрузчика URL-адреса изображения при отображении изображения из библиотеки объектов
  • Есть ли у вас какие-либо методы перехода с CameraRoll на новый контроллер представления?
  • Получить изображение на iPhone (TCP-клиент)
  • Приложение iOS: проблема с задержкой при отображении большого количества небольших изображений
  • Как добавить изображение в центр навигации в Objective-C?
  • Специфический атлас с комплектом Sprite взорван на iPad
  • iOS: Загрузка изображения с URL-адреса и сохранение на устройстве
  • Edge Сглаживание и заполнение внутренних контуров в opencv с iOS
  • Приложение запускается за образ запуска
  • Interesting Posts

    Текстовое поле ios7 должно заменять символы в строке не вызывается, когда слово выбирается из строки автокоррекции

    Определите дату (или версию), которую приложение было куплено в Google Play Store – эквивалент iOS appStoreReceiptURL

    Objective C – Использование свойства get accessor vs прямо с помощью iVar

    ios – navigationItem.titleView мигает при обновлении

    Почему высота последней ячейки UITableView используется для оставшихся пустых ячеек?

    HTTP-запрос в быстрой работе

    iOS 5 Twitter Framework: Tweeting без ввода и подтверждения пользователем (контроллер модального просмотра)

    несовместимый указатель на целочисленное преобразование, назначающее «NSInteger» (aka 'int')

    Пользовательский Getter & Setter iOS 5

    Как преобразовать NSData в pdf в iPhone sdk?

    iOS 8 CLLocationManagerDelegate методы никогда не вызывают

    ideviceinstaller не работает с ERROR: не удалось найти iTunesMetadata.plist в архиве

    Не удалось запустить ipa-файл в реальном устройстве IOS 10 с помощью appium 1.6.0

    Как указать исходный порт для HTTP-запроса в iOS

    Идентификатор пользователя Twitter в iOS 5

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.