Як я можу зберегти зображення в рулоні камери?


126

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

Відповіді:


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);
}

Скажімо, у мене є "- (IBAction) onClickSavePhoto: (id) відправник;" у моєму файлі ViewController.h, використовуючи те, що у вас є вище, що саме мені потрібно розмістити у файлі ViewController.m? Ще раз дякую!
користувач1470914

1
@ user1470914 Дивіться мою редагування. Крім того, де ви отримуєте зображення, яке потрібно зберегти у рулоні камери? Це вже в комплекті вашого додатка, або користувач робить знімок, а потім ви зберігаєте його в камері?
pasawaya

Дякуємо за терпіння qegal. У мене до цього часу не було можливості переглянути цю проблему. Ваш EDIT нам дуже корисний. Зображення знаходиться в комплекті програми. У додатку є кілька зображень, і їх можна розглядати як невеликі ескізи. Якщо вибрано невелику мініатюру, вона перейде до нового перегляду, і повноекранна версія може бути переглянута. У правому куті верхнього нав я розташована кнопка із написом "зберегти", і це кнопка, яку я хочу зберегти зображення у камері ролика пристрою, щоб його можна було застосувати як шпалери. Ще раз дякую за вашу допомогу та терпіння (не впевнений, чому casperOne закрив це).
користувач1470914

Я також додав UIImageView *imageToBeSaved;у свій .h файл. Я думав, що мені доведеться додати @synthesize imageToBeSaved.m, але я отримав помилку, яка говорить про "відсутність контексту для декларації про реалізацію власності"
user1470914,

4
Починаючи з iOS10, використання ключа NSPhotoLibraryUsageDescription в плісті є обов'язковим. Інші, через що пристрій виходить з ладу.
ASLLOP

56

Ось відповідь на iOS8 + за допомогою рамки Photos.

Завдання-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 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.p, щоб запитувати дозвіл на доступ до бібліотеки фотографій:

<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>

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.