Как сохранить изображение в фотопленке?

126

Я новичок в Xcode (использую 4.3) и не знаю, как сохранить изображение в фотопленке устройства. Все, что я сделал до сих пор, - это настроил IBAction для кнопки сохранения изображения. Какой библиотечный метод или функцию можно использовать для сохранения изображения в фотопленке пользователя?

user1470914
источник

Ответы:

238

Вы используете UIImageWriteToSavedPhotosAlbum()функцию.

//Let's say the image you want to save is in a UIImage called "imageToBeSaved"
UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);

Редактировать:

//ViewController.m
- (IBAction)onClickSavePhoto:(id)sender{

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}
pasawaya
источник
Допустим, у меня есть '- (IBAction) onClickSavePhoto: (id) sender;' в моем файле ViewController.h, используя то, что у вас есть выше, что именно мне нужно поместить в файл ViewController.m? Еще раз большое спасибо!
user1470914
1
@ user1470914 См. мою правку. Кроме того, где вы берете изображение для сохранения в фотопленке? Это уже в комплекте вашего приложения, или пользователь делает снимок, а затем вы сохраняете его в фотопленке?
pasawaya
Спасибо за терпение, qegal. До сих пор у меня не было возможности вернуться к этому вопросу. Ваш РЕДАКТИРОВАТЬ нам очень полезно. Изображение находится в комплекте приложения. В приложении есть несколько изображений, и их можно просматривать в виде небольших эскизов. Когда выбрана небольшая миниатюра, она переходит в новый вид, и можно просматривать полноэкранную версию. У меня есть кнопка в правом углу верхней панели навигации с надписью «Сохранить», и это кнопка, с помощью которой я хочу сохранить изображение в камеру камеры устройства, чтобы его можно было применить в качестве обоев. Еще раз спасибо за вашу помощь и терпение (не знаю, почему casperOne закрыл это).
user1470914
Я также добавил UIImageView *imageToBeSaved;в свой файл .h. Я думал, что мне придется добавить @synthesize imageToBeSavedв свой .m, но я получаю сообщение об ошибке «Отсутствует контекст для объявления реализации свойства»
user1470914,
4
Начиная с iOS10, использование ключа NSPhotoLibraryUsageDescription в plist обязательно. В противном случае приложение вылетает.
ASLLOP
56

Вот ответ для iOS8 + с использованием платформы Photos.

Objective-C:

#import <Photos/Photos.h>

UIImage *snapshot = self.myImageView.image;

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
    changeRequest.creationDate          = [NSDate date];
} completionHandler:^(BOOL success, NSError *error) {
    if (success) {
        NSLog(@"successfully saved");
    }
    else {
        NSLog(@"error saving to photos: %@", error);
    }
}];

Swift:

// Swift 4.0
import Photos

let snapshot: UIImage = someImage

PHPhotoLibrary.shared().performChanges({
    PHAssetChangeRequest.creationRequestForAsset(from: snapshot)
}, completionHandler: { success, error in
    if success {
        // Saved successfully!
    }
    else if let error = error {
        // Save photo failed with error
    }
    else {
        // Save photo failed with no error
    }
})

Вот ссылка на документацию Apple.

Не забудьте добавить соответствующий ключ / значение в свой info.plist, чтобы запросить разрешение на доступ к библиотеке фотографий:

<key>NSCameraUsageDescription</key>
<string>Enable camera access to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Enable photo library access to select a photo from your library.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Enable photo library access to save images to your photo library directly from the app.</string>
digitalHound
источник
2
Как получить URL-адрес изображения @ricardopereira
Mansuu ....
@Mansuu, пожалуйста, посмотрите stackoverflow.com/a/37248867/3641812
ricardopereira
9

Для справки, вы можете сохранять видео аналогичным образом:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Вы можете сохранить видео для загрузки в Instagram, например:

// Save video to camera roll; we can share to Instagram from there.
-(void)didTapShareToInstagram:(id)sender { 
    UISaveVideoAtPathToSavedPhotosAlbum(self.videoPath, self, @selector(video:didFinishSavingWithError:contextInfo:), (void*)CFBridgingRetain(@{@"caption" : caption}));
}

- (void)               video: (NSString *) videoPath
    didFinishSavingWithError: (NSError *) error
                 contextInfo: (void *) contextInfoPtr {

    NSDictionary *contextInfo = CFBridgingRelease(contextInfoPtr);
    NSString *caption         = contextInfo[@"caption"];

    NSString *escapedString   = [videoPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString
    NSString *escapedCaption  = [caption stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString

    NSURL *instagramURL       = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@", escapedString, escapedCaption]];

    [[UIApplication sharedApplication] openURL:instagramURL];
}
Грэм Перкс
источник
4

Сохраните изображение в библиотеке фотографий в Swift 4

Добавьте "Конфиденциальность - Описание использования дополнений фотобиблиотеки" в info.plist

Затем используйте следующий код для сохранения изображения

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
Махеш Чаудхари
источник
0

Используйте asImage (), чтобы получить уникальный контент для сохранения в фотопленке.

Если вы используете asImage (), вы можете сохранить множество забавных вещей в фотопленке всего несколькими строками кода! Это может быть очень эффективным, если в объект уже включена некоторая прозрачность.

asImage () работает с UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView для именования некоторых объектов (но они могут быть видимыми, когда вы получаете изображение (с ненулевым альфа-каналом)). Я даже использую его для захвата тайлинга, но он уже загружен в UIImageView в моем дизайне. Я подозреваю, что asImage () может работать и со многими другими типами объектов, но я пробовал только те, которые упоминал.

Если это UITextView, и вы устанавливаете цвет фона на .clear, тогда текст сохраняется с прозрачным фоном. Если ваш текст содержит эмодзи или Memoji, теперь вы можете поместить эти изображения в фотопленку или во внутренние UIImageViews вашего приложения. Наличие Memoji / Emoji с прозрачным фоном в папке «Фотопленка», где их можно использовать в любых приложениях, - это мощный инструмент.

Другие объекты могут иметь некоторую прозрачность, если вы обрежете фотоизображение до круга или зададите радиус угла, чтобы обрезать углы.

Обратите внимание на мой код, pointerToTextObjectSelected - это UITextView


var pointerToTextObjectSelected = UITextView()
// above populated elsewhere

let thisObject = pointerToTextObjectSelected.asImage()

let imageData = thisObject.pngData()

let imageToSave = UIImage(data: imageData!)

UIImageWriteToSavedPhotosAlbum(imageToSave!, nil, nil, nil)
user3408691
источник