2014-11-02 4 views
8

Ich schreibe eine Swift App für iOS. Ich möchte wissen, wie man ein Bild von der Kamerarolle des Benutzers (oder wie auch immer sie es in diesen Tagen nennt) erstellt und es lokal in der App speichert, damit ich später darauf verweisen kann. Wie sollte man das machen? Nehmen wir als Beispiel an, dass ich das Bild als Bild für eine UIImageView in meinem Storyboard abrufen möchte.iOS & Swift - Wie kann ich ein UIImage vom Benutzer erhalten und speichern?

+0

Suchen ALAssetsLibrary – Abizern

+0

Ich denke, diese Verbindung wird Ihnen helfen, eine Menge [überprüfen hier] [1] [1]: http://stackoverflow.com/questions/25730830/how- to-get-only-images-in-der-kamera-rollen-mit-fotos-framework –

Antwort

4

Dies ist genau das, was UIImagePickerController kombiniert mit NSUserDefaults tun wird.

Für Sie wird es eine zweiteilige Aufgabe sein. Zuerst müssen Sie das Bild mit einem UIImagePickerController erfassen und dann entweder in der Fotobibliothek speichern oder mit NSUserDefaults auf dem Gerät speichern.

Um ein Bild mit NSUserDefaults zu speichern, siehe this question.

+10

Benutzereinstellungen für Bilder? "Ja wirklich?" – Abizern

+0

@Abizern Siehe meine Bearbeitung. –

+0

Es ist immer noch eine schlechte Idee. Sie können die Bilder einfach in der lokalen Sandbox speichern und mit einem geeigneteren Persistenzmechanismus auf sie verweisen. – Abizern

2

Ray Wenderlich hat eine great tutorial für die Verwendung einer UIImagePickerController, um ein Bild auszuwählen und dann mit der AssetsLibrary in ein Album speichern.

Es gibt auch Informationen zur Verwendung von Bildfiltern, die mehr sind, als Sie im Lernprogramm gefordert haben.

+0

Ich bekomme diesen Fehler. http://postimg.org/image/gcfwet8uf/ – quillford

+0

Die einzige Möglichkeit, die ich nicht konform mit dem UIImagePickerControllerDelegate ist, ist nicht konform zu UINavigationControllerDelegate. Der UIPicker benötigt einen Nav-Controller. –

2

Sobald Sie das UIImage-Objekt zu erhalten, können Sie das Bild in einem doc dir mit dem folgenden Code speichern

let imageData = NSData(data:UIImagePNGRepresentation(wineImage.image)) 
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
var docs: String = paths[0] as! String 
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png") 
let result = imageData.writeToFile(fullPath, atomically: true) 
0

Sie auf jeden Fall ein UIImagePickerController als Brian erwähnte verwenden soll, wenn Sie das ausgewählte Bild diese Datei haben Manageransatz. Ich empfehle NSUserDefaults nicht mit Bildern zu speichern, wie es gegen Apple guidelines geht:

let imageData = UIImagePNGRepresentation(selectedImage) 
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
let imagePath = paths.stringByAppendingPathComponent("cached.png") 

if !imageData.writeToFile(imagePath, atomically: false) 
{ 
    println("not saved") 
} else { 
    println("saved") 
    NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath") 
} 
3

Hier meine Kombination ist.

Speichern von Bild:

let imageData = NSData(data:UIImagePNGRepresentation(pickedimage)) 
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
var docs: String = paths[0] as! String 
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png") 
let result = imageData.writeToFile(fullPath, atomically: true) 

print(fullPath) 

Get Image:

let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory 
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask 
if let paths   = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) 
{ 
    if paths.count > 0 
    { 
     if let dirPath = paths[0] as? String 
     { 
      let readPath = dirPath.stringByAppendingPathComponent("yourNameImg.png") 
      let image = UIImage(contentsOfFile: readPath) 

      UploadImagePreview.image = image 
     } 
    } 
} 

Wir können mit Fotos Rahmen versuchen, das letzte gespeicherte Bild zu holen.

var fetchOptions: PHFetchOptions = PHFetchOptions() 
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 

var fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) 

if (fetchResult.firstObject != nil) { 
    var lastAsset: PHAsset = fetchResult.lastObject as! PHAsset 

    PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: self.UploadImagePreview.bounds.size, contentMode: PHImageContentMode.AspectFill, options: PHImageRequestOptions(), resultHandler: { (result, info) -> Void in 
     self.UploadImagePreview.image = result 
    }) 
} 
+0

UIImage (contentsOfFile :) funktioniert nicht –

+0

@ Rodrigo: Es funktioniert nur, wenn ein vollständiger Pfad des Bildes angegeben wird. –

Verwandte Themen