Comment puis-je enregistrer une image sur la pellicule?

126

Je suis nouveau sur Xcode (en utilisant 4.3) et je ne sais pas comment enregistrer une image sur la pellicule de l'appareil photo. Tout ce que j'ai fait jusqu'à présent est de configurer une IBAction pour que le bouton enregistre l'image. Quelle méthode ou fonction de bibliothèque puis-je utiliser pour enregistrer une image sur la pellicule de l'appareil photo de l'utilisateur?

user1470914
la source

Réponses:

238

Vous utilisez la UIImageWriteToSavedPhotosAlbum()fonction.

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

Éditer:

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

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}
pasawaya
la source
Disons que j'ai '- (IBAction) onClickSavePhoto: (id) sender;' dans mon fichier ViewController.h, en utilisant ce que vous avez ci-dessus, que dois-je exactement placer dans le fichier ViewController.m? Merci encore beaucoup!
user1470914
1
@ user1470914 Voir ma modification. En outre, où obtenez-vous l'image à enregistrer sur la pellicule? Est-ce déjà dans le bundle de votre application, ou l'utilisateur prend-il une photo, puis vous l'enregistrez dans la pellicule?
pasawaya
Merci pour votre patience qegal. Je n'ai pas eu l'occasion de revenir sur ce problème jusqu'à présent. Votre EDIT nous super utile. L'image est dans le bundle de l'application. Il y a plusieurs images dans l'application et elles peuvent être affichées sous forme de petites vignettes. Lorsqu'une petite vignette est sélectionnée, elle passe à une nouvelle vue et une version plein écran peut être affichée. J'ai un bouton dans le coin droit de la barre de navigation supérieure qui dit "enregistrer" et c'est le bouton que je souhaite enregistrer l'image sur le rouleau de caméra de l'appareil afin qu'elle puisse être appliquée comme fond d'écran. Merci encore pour votre aide et votre patience (je ne sais pas pourquoi casperOne a fermé cela).
user1470914
J'ai également ajouté UIImageView *imageToBeSaved;à mon fichier .h. Je pensais que je devrais ajouter @synthesize imageToBeSaveddans mon .m mais j'obtiens une erreur qui dit "contexte manquant pour la déclaration d'implémentation de propriété"
user1470914
4
À partir d'iOS10, l'utilisation de la clé NSPhotoLibraryUsageDescription dans plist est obligatoire. Sinon, l'application plante.
ASLLOP
56

Voici une réponse pour iOS8 + en utilisant le framework Photos.

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

Rapide:

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

Voici un lien vers la documentation Apple.

N'oubliez pas d'ajouter la clé / valeur appropriée à votre info.plist pour demander l'autorisation d'accéder à la photothèque:

<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
la source
2
Comment obtenir l'url de l'image @ricardopereira
Mansuu ....
@Mansuu Veuillez consulter stackoverflow.com/a/37248867/3641812
ricardopereira
9

Pour référence, vous pouvez enregistrer des vidéos de la même manière:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Vous voudrez peut-être enregistrer une vidéo à télécharger sur Instagram, par exemple:

// 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];
}
Avantages Graham
la source
4

Enregistrez l'image dans la photothèque dans Swift 4

Ajoutez "Confidentialité - Description de l'utilisation des ajouts à la photothèque" dans info.plist

Ensuite, utilisez le code suivant pour enregistrer l'image

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
Mahesh Chaudhari
la source
0

Utilisez asImage () pour obtenir un contenu unique à enregistrer sur la pellicule.

Si vous utilisez asImage (), vous pouvez enregistrer une variété de choses amusantes sur la pellicule avec seulement quelques lignes de code! Cela peut être très puissant si l'objet possède déjà une certaine transparence.

asImage () fonctionne avec UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView pour nommer certains objets (mais ils peuvent avoir besoin d'être visibles lorsque vous obtenez l'image (ayant un alpha différent de zéro)). Je l'utilise même pour capturer le carrelage, mais il est déjà chargé dans un UIImageView dans ma conception. Je soupçonne que asImage () peut également fonctionner avec beaucoup plus de types d'objets, mais je n'ai essayé que ceux que j'ai mentionnés.

S'il s'agit d'un UITextView et que vous définissez la couleur d'arrière-plan sur .clear, le texte est enregistré avec un arrière-plan transparent. Si votre texte contient des emoji ou des Memoji, vous pouvez désormais obtenir ces images dans la pellicule ou dans UIImageViews interne à votre application. Avoir Memoji / Emoji avec un fond transparent dans votre pellicule où ils peuvent être utilisés dans n'importe quelle variété d'applications est puissant.

D'autres objets peuvent avoir une certaine transparence si vous recadrez une image photo en cercle ou définissez le rayon des coins pour couper les coins.

Notez dans mon code, pointerToTextObjectSelected est un 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
la source