Wie speichere ich ein Bild in der iPhone-Fotobibliothek?
193
Was muss ich tun, um ein von meinem Programm erzeugtes Bild (möglicherweise von der Kamera, möglicherweise nicht) in der Systemfotobibliothek auf dem iPhone zu speichern?
UIImageWriteToSavedPhotosAlbum(UIImage*image,
id completionTarget,
SEL completionSelector,void*contextInfo);
Sie benötigen Nur CompletionTarget , CompletionSelector und ContextInfo, wenn Sie benachrichtigt werden möchten, wenn das UIImageSpeichern abgeschlossen ist. Andernfalls können Sie übergeben nil.
Hallo, danke für deine großartige Lösung. Hier habe ich einen Zweifel, wie wir Duplikate beim Speichern von Bildern in der Fotobibliothek vermeiden können. Danke im Voraus.
Gibt es eine Möglichkeit, beliebige Metadaten zusammen mit dem Foto zu speichern?
Zakdances
2
Ich habe versucht, mit ALAssetsLibraryzu speichern UIImageWriteToSavedPhotosAlbum. Das Speichern dauert genauso lange wie .
Hlung
Und das friert die Kamera ein :( Ich denke, es wird kein Hintergrund unterstützt?
Hlung
Dieser ist so viel sauberer, dass Sie einen Block verwenden können, um die Fertigstellung zu handhaben.
Jpswain
5
Ich verwende diesen Code und füge dieses Framework #import <AssetsLibrary / AssetsLibrary.h> hinzu, nicht die AVFoundation. Sollte die Antwort nicht bearbeitet werden? @ Denis
Übergeben Sie einfach die Bilder von einem Array wie folgt
-(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);}}
Tut mir leid, dass Tippfehler dies im laufenden Betrieb getan haben, aber Sie verstehen es
Wenn Sie dies verwenden, werden einige der Fotos fehlen, ich habe es versucht. Der richtige Weg dorthin ist die Verwendung des Rückrufs von der Abschlussauswahl.
SamChen
1
Können wir Bilder mit dem benutzerdefinierten Namen speichern?
Benutzer 1531343
Man sollte dafür niemals eine for-Schleife verwenden. Es führt zum Rennzustand und stürzt ab.
Saurabh
4
Verwenden Sie beim Speichern eines Arrays von Fotos keine for-Schleife. Gehen Sie wie folgt vor
-(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.}}
Fügen Sie jedes Bild, das Sie speichern möchten, einem NSMutableArray hinzu
//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);}}
Wenn Sie nicht benachrichtigt werden möchten, wenn das Speichern des Bildes abgeschlossen ist, können Sie in den Parametern CompletionTarget , CompletionSelector und contextInfo Null übergeben .
Das Wichtigste dabei ist, dass Ihre Methode, die das Speichern von Bildern beobachtet, diese drei Parameter haben sollte. Andernfalls treten NSInvocation-Fehler auf.
Antworten:
Sie können diese Funktion verwenden:
Sie benötigen Nur CompletionTarget , CompletionSelector und ContextInfo, wenn Sie benachrichtigt werden möchten, wenn das
UIImage
Speichern abgeschlossen ist. Andernfalls können Sie übergebennil
.Siehe die offizielle Dokumentation für
UIImageWriteToSavedPhotosAlbum()
.quelle
In iOS 9.0 veraltet.
Es gibt viel schneller als UIImageWriteToSavedPhotosAlbum, dies mit dem iOS 4.0+ AssetsLibrary-Framework zu tun
quelle
ALAssetsLibrary
zu speichernUIImageWriteToSavedPhotosAlbum
. Das Speichern dauert genauso lange wie .Der einfachste Weg ist:
Weitere
Swift
Informationen finden Sie unter Speichern in der iOS-Fotobibliothek mit Swiftquelle
Beachten Sie Folgendes: Wenn Sie einen Rückruf verwenden, stellen Sie sicher, dass Ihr Selektor dem folgenden Formular entspricht:
Andernfalls stürzen Sie mit einem Fehler wie dem folgenden ab:
[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
quelle
Übergeben Sie einfach die Bilder von einem Array wie folgt
Tut mir leid, dass Tippfehler dies im laufenden Betrieb getan haben, aber Sie verstehen es
quelle
Verwenden Sie beim Speichern eines Arrays von Fotos keine for-Schleife. Gehen Sie wie folgt vor
quelle
In Swift :
quelle
Die folgende Funktion würde funktionieren. Sie können von hier kopieren und dort einfügen ...
quelle
Swift 4
quelle
meine letzte Antwort wird es tun ..
Fügen Sie jedes Bild, das Sie speichern möchten, einem NSMutableArray hinzu
quelle
quelle
Ich habe hierfür eine UIImageView-Kategorie erstellt, basierend auf einigen der obigen Antworten.
Header-Datei:
Implementierung
Rufen Sie jetzt einfach diese Funktion in Ihrer Bildansicht auf:
Optional können Sie den Parameter MinimumPressDuration ändern.
quelle
In Swift 2.2
Wenn Sie nicht benachrichtigt werden möchten, wenn das Speichern des Bildes abgeschlossen ist, können Sie in den Parametern CompletionTarget , CompletionSelector und contextInfo Null übergeben .
Beispiel:
Das Wichtigste dabei ist, dass Ihre Methode, die das Speichern von Bildern beobachtet, diese drei Parameter haben sollte. Andernfalls treten NSInvocation-Fehler auf.
Ich hoffe es hilft.
quelle
Sie können dies verwenden
quelle