Jak mogę zapisać obraz na rolce z aparatu?

126

Jestem nowy w Xcode (używam wersji 4.3) i nie wiem, jak zapisać obraz w rolce aparatu urządzenia. Wszystko, co zrobiłem do tej pory, to skonfigurowanie IBAction dla przycisku do zapisania obrazu. Jakiej metody lub funkcji biblioteki mogę użyć, aby zapisać obraz na rolce z aparatu użytkownika?

user1470914
źródło

Odpowiedzi:

238

Używasz UIImageWriteToSavedPhotosAlbum()funkcji.

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

Edytować:

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

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}
pasawaya
źródło
Powiedzmy, że mam '- (IBAction) onClickSavePhoto: (id) sender;' w moim pliku ViewController.h, korzystając z tego, co masz powyżej, co dokładnie powinienem umieścić w pliku ViewController.m? Jeszcze raz wielkie dzięki!
user1470914
1
@ user1470914 Zobacz moje zmiany. Ponadto, skąd bierzesz obraz do zapisania na rolce z aparatu? Czy jest już w pakiecie Twojej aplikacji, czy też użytkownik robi zdjęcie, a następnie zapisuje je na rolce z aparatu?
pasawaya
Dzięki za cierpliwość qegal. Do tej pory nie miałem okazji wrócić do tego zagadnienia. Twoja EDYCJA nas bardzo pomocna. Obraz znajduje się w pakiecie aplikacji. W aplikacji znajduje się kilka obrazów, które można wyświetlać jako małe miniatury. Po wybraniu małej miniatury przechodzi się do nowego widoku i można wyświetlić wersję pełnoekranową. Mam przycisk w prawym rogu górnego panelu nawigacyjnego, który mówi „zapisz” i jest to przycisk, na którym chcę zapisać obraz na rolce kamery urządzenia, aby można go było zastosować jako tapetę. Jeszcze raz dziękuję za pomoc i cierpliwość (nie wiem, dlaczego casperOne to zamknął).
user1470914
Dodałem również UIImageView *imageToBeSaved;do mojego pliku .h. Pomyślałem, że będę musiał dodać @synthesize imageToBeSavedw swoim .m, ale pojawia się błąd z informacją „Brak kontekstu dla deklaracji implementacji właściwości”
user1470914
4
Począwszy od iOS10, używanie klucza NSPhotoLibraryUsageDescription w plist jest obowiązkowe. W przeciwnym razie aplikacja ulega awarii.
ASLLOP
56

Oto odpowiedź na iOS8 + przy użyciu struktury Zdjęcia.

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

Szybki:

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

Oto link do dokumentacji Apple.

Nie zapomnij dodać odpowiedniego klucza / wartości do swojego info.plist, aby poprosić o pozwolenie na dostęp do biblioteki zdjęć:

<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
źródło
2
Jak uzyskać adres URL obrazu @ricardopereira
Mansuu ....
@Mansuu Zajrzyj na stackoverflow.com/a/37248867/3641812
ricardopereira
9

Dla porównania możesz zapisywać filmy w podobny sposób:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Możesz zapisać film do przesłania na Instagram, na przykład:

// 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];
}
Graham Perks
źródło
4

Zapisz obraz w bibliotece zdjęć w Swift 4

Dodaj "Prywatność - Dodatki do biblioteki zdjęć Opis użytkowania" w info.plist

Następnie użyj poniższego kodu, aby zapisać obraz

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
Mahesh Chaudhari
źródło
0

Użyj asImage (), aby uzyskać unikalną zawartość do zapisania na rolce z aparatu.

Jeśli używasz asImage (), możesz zapisać wiele zabawnych rzeczy w rolce z aparatu za pomocą zaledwie kilku linii kodu! Może to być bardzo potężne, jeśli obiekt ma już włączoną przezroczystość.

asImage () współpracuje z UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView, aby nazwać niektóre obiekty (ale może być konieczne, aby były widoczne, gdy pojawi się obraz (mający niezerową alfa)). Używam go nawet do przechwytywania kafelków, ale jest to załadowane do UIImageView już w moim projekcie. Podejrzewam, że asImage () może działać również z wieloma innymi typami obiektów, ale wypróbowałem tylko te, o których wspomniałem.

Jeśli jest to UITextView i ustawisz kolor tła na .clear, tekst zostanie zapisany z przezroczystym tłem. Jeśli Twój tekst zawiera emoji lub memoji, możesz teraz przenieść te obrazy do rolki aparatu lub do UIImageViews w swojej aplikacji. Posiadanie Memoji / Emoji z przezroczystym tłem w rolce z aparatu, gdzie można ich używać w różnych aplikacjach, jest potężne.

Inne obiekty mogą mieć pewną przezroczystość, jeśli przycinasz zdjęcie do koła lub ustawisz promień narożnika, aby przyciąć rogi.

Uwaga w moim kodzie, pointerToTextObjectSelected jest 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
źródło