Что мне нужно сделать, чтобы сохранить изображение, сгенерированное моей программой (возможно, с камеры, возможно, нет), в системную библиотеку фотографий на iPhone?
UIImageWriteToSavedPhotosAlbum(UIImage*image,
id completionTarget,
SEL completionSelector,void*contextInfo);
Вам нужно только завершение , завершение , завершение и контекстная информация, только если вы хотите получать уведомления о UIImageзавершении сохранения, в противном случае вы можете передать nil.
Привет спасибо за ваше отличное решение. Здесь у меня есть одно сомнение, как мы можем избежать дубликатов при сохранении изображения в библиотеке фотографий. Заранее спасибо.
Теперь вам нужно добавить «Конфиденциальность - описание использования дополнений библиотеки фотографий» начиная с iOS 11, чтобы сохранить фотографии в альбоме пользователя.
хоккей
1
как дать имя сохраненным изображениям?
Priyal
63
Устаревший в iOS 9.0.
Есть гораздо более быстрый, чем UIImageWriteToSavedPhotosAlbum способ сделать это с помощью iOS 4.0+ AssetsLibrary Framework
Есть ли способ сохранить произвольные метаданные вместе с фотографией?
Закданс
2
Я пытался сохранить с помощью ALAssetsLibrary, требуется столько же времени, чтобы сохранить как UIImageWriteToSavedPhotosAlbum.
Хлунг
И это зависает камера :( Я думаю, что это не поддерживается фон?
Hlung
Это намного чище, потому что вы можете использовать блок для обработки завершения.
jpswain
5
Я использую этот код, и я включаю эту платформу #import <AssetsLibrary / AssetsLibrary.h> не AVFoundation. Разве ответ не должен быть отредактирован? @ Денис
Просто передайте изображения из массива к нему так
-(void) saveMePlease {//Loop through the array herefor(int i=0:i<[arrayOfPhotos count]:i++){NSString*file =[arrayOfPhotos objectAtIndex:i];NSString*path =[get the path of the image like you would in DOCS FOLDER or whatever];NSString*imagePath =[path stringByAppendingString:file];UIImage*image =[[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];//Now it will do this for each photo in the arrayUIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);}}
Извините за опечатку вроде просто сделал это на лету, но вы поняли
Используя это будет пропустить некоторые из фотографий, я попробовал это. Правильный способ сделать это - использовать обратный вызов из селектора завершения.
SamChen
1
мы можем сохранить изображения с пользовательским именем?
Пользователь 1531343
Никогда не следует использовать для цикла для этого. Это приводит к состоянию гонки и сбоям.
Саураб
4
При сохранении массива фотографий не используйте цикл for, сделайте следующее
-(void)saveToAlbum{[self performSelectorInBackground:@selector(startSavingToAlbum) withObject:nil];}-(void)startSavingToAlbum{
currentSavingIndex =0;UIImage* img = arrayOfPhoto[currentSavingIndex];//get your imageUIImageWriteToSavedPhotosAlbum(img,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);}-(void)image:(UIImage*) image didFinishSavingWithError:(NSError*) error contextInfo:(void*) contextInfo{//can also handle error message as well
currentSavingIndex ++;if(currentSavingIndex >= arrayOfPhoto.count){return;//notify the user it's done.}else{UIImage* img = arrayOfPhoto[currentSavingIndex];UIImageWriteToSavedPhotosAlbum(img,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);}}
// Save it to the camera roll / saved photo album// UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, nil, nil, nil) or UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image,self,"image:didFinishSavingWithError:contextInfo:",nil)
func image(image:UIImage!, didFinishSavingWithError error:NSError!, contextInfo:AnyObject!){if(error !=nil){// Something wrong happened.}else{// Everything is alright.}}
для каждого изображения, которое вы хотите сохранить, добавьте его в NSMutableArray
//in the .h file put:NSMutableArray*myPhotoArray;///then in the .m-(void) viewDidLoad {
myPhotoArray =[[NSMutableArray alloc]init];}//However Your getting images-(void) someOtherMethod {UIImage*someImage =[your prefered method ofusingthis];[myPhotoArray addObject:someImage];}-(void) saveMePlease {//Loop through the array herefor(int i=0:i<[myPhotoArray count]:i++){NSString*file =[myPhotoArray objectAtIndex:i];NSString*path =[get the path of the image like you would in DOCS FOLDER or whatever];NSString*imagePath =[path stringByAppendingString:file];UIImage*image =[[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];//Now it will do this for each photo in the arrayUIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);}}
Если вы не хотите получать уведомление, когда изображение будет сохранено, вы можете передать nil в параметры завершение , завершение, выбор и контекстную информацию .
Здесь важно отметить, что ваш метод, который наблюдает за сохранением изображения, должен иметь эти 3 параметра, иначе вы столкнетесь с ошибками NSInvocation.
Ответы:
Вы можете использовать эту функцию:
Вам нужно только завершение , завершение , завершение и контекстная информация, только если вы хотите получать уведомления о
UIImage
завершении сохранения, в противном случае вы можете передатьnil
.Смотрите официальную документацию для
UIImageWriteToSavedPhotosAlbum()
.источник
Устаревший в iOS 9.0.
Есть гораздо более быстрый, чем UIImageWriteToSavedPhotosAlbum способ сделать это с помощью iOS 4.0+ AssetsLibrary Framework
источник
ALAssetsLibrary
, требуется столько же времени, чтобы сохранить какUIImageWriteToSavedPhotosAlbum
.Самый простой способ:
Для
Swift
, вы можете обратиться к Сохранение в библиотеке фотографий iOS с помощью Swiftисточник
Помните одну вещь: если вы используете обратный вызов, убедитесь, что ваш селектор соответствует следующей форме:
В противном случае произойдет сбой с такой ошибкой, как:
[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
источник
Просто передайте изображения из массива к нему так
Извините за опечатку вроде просто сделал это на лету, но вы поняли
источник
При сохранении массива фотографий не используйте цикл for, сделайте следующее
источник
В Свифте :
источник
Ниже функция будет работать. Вы можете скопировать отсюда и вставить туда ...
источник
Swift 4
источник
мой последний ответ сделает это ..
для каждого изображения, которое вы хотите сохранить, добавьте его в NSMutableArray
источник
источник
Я создал для этого категорию UIImageView, основываясь на некоторых ответах выше.
Заголовочный файл:
Реализация
Теперь просто вызовите эту функцию в вашем изображении:
При желании вы можете изменить параметр MinimumPressDuration.
источник
В Swift 2.2
Если вы не хотите получать уведомление, когда изображение будет сохранено, вы можете передать nil в параметры завершение , завершение, выбор и контекстную информацию .
Пример:
Здесь важно отметить, что ваш метод, который наблюдает за сохранением изображения, должен иметь эти 3 параметра, иначе вы столкнетесь с ошибками NSInvocation.
Надеюсь, поможет.
источник
Вы можете использовать это
источник