Каков правильный способ импорта и сохранения фотографий из iPhone Album?

Я импортирую фотографии из альбома iPhone в папку документов моего приложения. Это мой код.

for (int j=0; j<[assetArray count]; j++) { ALAsset *assest = [assetArray objectAtIndex:j]; CGImageRef imageRef = assest.defaultRepresentation.fullResolutionImage; UIImage *image = [UIImage imageWithCGImage:imageRef]; NSData *imageData = UIImageJPEGRepresentation(image); [imageData writeToFile:documentsPath atomically:YES]; } 

Он работает отлично, но когда я пытаюсь импортировать изображения с более высоким разрешением, требуется больше времени. Каков правильный способ импорта за минимальное время? BTW: Мне нужно больше времени, когда я конвертирую image в NSData .

    Опасно использовать fullResolutionImage для этой задачи по нескольким причинам. Некоторые замечания:

    1. Для больших изображений могут возникнуть проблемы с памятью. при использовании метода fullResolutionImage. Обратите внимание: фотобиблиотека (по крайней мере, на iPad) также может содержать RAW-изображения.
    2. Производительность субоптимальна как внутри файла образа ImageIO создает сначала CGImageRef, который затем преобразуется в JPEG. Это требует времени.
    3. AssetLibrary также может содержать видео. В таком случае fullResolutionImage возвращает только предварительный просмотр видео, но не фактическое видео.
    4. Нет никаких проблем, чтобы хранить фактические объекты-объекты, поскольку они малы в памяти.

    Более удобный подход для записи изображений в каталог документов должен был бы использовать метод getBytes для ALAssetsRepresentation. Это должно быть быстрее и эффективнее. Он также дает вам исходный файл изображения (включая метаданные), а также работает для видео.

    Ваш примерный код, переписанный тогда, будет выглядеть так:

     //reading out the orginal images for (int j=0; j<[assetArray count]; j++) { ALAssetRepresentation *representation = [[assetArray objectAtIndex:j] defaultRepresentation]; NSString* filename = [documentPath stringByAppendingPathComponent:[representation filename]]; [[NSFileManager defaultManager] createFileAtPath:filename contents:nil attributes:nil]; NSOutputStream *outPutStream = [NSOutputStream outputStreamToFileAtPath:filename append:YES]; [outPutStream open]; long long offset = 0; long long bytesRead = 0; NSError *error; uint8_t * buffer = malloc(131072); while (offset<[representation size] && [outPutStream hasSpaceAvailable]) { bytesRead = [representation getBytes:buffer fromOffset:offset length:131072 error:&error]; [outPutStream write:buffer maxLength:bytesRead]; offset = offset+bytesRead; } [outPutStream close]; free(buffer); } //reading out the fullScreenImages and thumbnails for (int j=0; j<[assetArray count]; j++) { @autoreleasepool { ALAsset *asset = [assetArray objectAtIndex:j]; NSString *orgFilename = [representation filename]; NSString *filenameFullScreen = [NSString stringWithFormat:@"%@_fullscreen.png",[orgFilename stringByDeletingPathExtension]] NSString* pathFullScreen = [documentPath stringByAppendingPathComponent:filenameFullScreen]; CGImageRef imageRefFullScreen = [[asset defaultRepresentation] fullScreenImage]; UIImage *imageFullScreen = [UIImage imageWithCGImage:imageRefFullScreen]; NSData *imageDataFullScreen = UIImagePNGRepresentation(imageFullScreen); [imageDataFullScreen writeToFile:pathFullScreen atomically:YES]; NSString *filenameThumb = [NSString stringWithFormat:@"%@_thumb.png",[orgFilename stringByDeletingPathExtension]] NSString* pathThumb = [documentPath stringByAppendingPathComponent:filenameThumb]; CGImageRef imageRefThumb = [asset thumbnail]; UIImage *imageThumb = [UIImage imageWithCGImage:imageRefThumb]; NSData *imageDataThumb = UIImagePNGRepresentation(imageThumb); [imageDataThumb writeToFile:pathThumb atomically:YES]; } } 

    Я использовал ELCImagePicker и столкнулся с такой же проблемой при одновременном одновременном импортировании нескольких фотографий из библиотеки фотографий с использованием сортиров. Мы не можем сократить время на импорт, но проблема с сбоем будет решена.

     for (int j=0; j<[assetArray count]; j++) { @autoreleasepool // This is compiler level feature so will only work on xcode 4.1 or above { ALAsset *assest = [assetArray objectAtIndex:j]; CGImageRef imageRef = assest.defaultRepresentation.fullResolutionImage; UIImage *image = [UIImage imageWithCGImage:imageRef]; NSData *imageData = UIImagePNGRepresentation(image); [imageData writeToFile:documentsPath atomically:YES]; } } 

    Если возможно, попробуйте сохранить только AssetURL в assetArray вместо всего объекта ALAsset и создать ALAsset за раз от url, так что это может помочь уменьшить потребление памяти. В таком случае вам нужно будет использовать блоки как

     ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { CGImageRef iref = [[myasset defaultRepresentation] fullResolutionImage]; if (iref) //You have image so use it { } }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { NSLog(@"Can't get image - %@",[myerror localizedDescription]); }; ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; [assetslibrary assetForURL:imageURL resultBlock:resultblock failureBlock:failureblock]; 
    Interesting Posts
    Давайте будем гением компьютера.