Frage

Ich habe eine UIImageView, mit der ein Benutzer ein Bild platzieren und halten kann, bis es gespeichert werden kann. Das Problem ist, dass ich nicht herausfinden kann, wie ich das Bild speichern und abrufen kann, das ich in der Ansicht platziert habe.

Ich habe das Bild wie folgt abgerufen und in die UIImageview platziert:

//Get Image 
- (void) getPicture:(id)sender {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo {
    myPic.image = image;
    [picker dismissModalViewControllerAnimated:YES];
}

Es zeigt das ausgewählte Bild in meiner UIImageView in Ordnung, aber ich habe keine Ahnung, wie ich es speichern kann. Ich speichere alle anderen Teile der Ansicht (meistens Uitextfield) in Kerndaten. Ich habe gesucht und gesucht und viele Code -Teile ausprobiert, die Leute vorgeschlagen haben, aber entweder trete ich nicht richtig in den Code ein oder diese Vorschläge funktionieren nicht mit der Art und Weise, wie ich meinen Code eingerichtet habe. Es ist wahrscheinlich der erstere. Ich möchte das Bild in der UIImageView mit derselben Aktion (eine Schaltfläche Speichern) speichern, mit der ich den Text in den Uitextfields speichern kann. So speichere ich meine Uitextfield -Info:

// Handle Save Button
- (void)save {

    // Get Info From UI
    [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"];

Wie ich bereits sagte, habe ich verschiedene Methoden ausprobiert, um dies zum Laufen zu bringen, kann es aber nicht verstehen. Zum ersten Mal in meinem Leben wollte ich einem leblosen Objekt körperlichen Schaden anrichten, aber ich habe es geschafft, mich zurückzuhalten.

Ich möchte in der Lage sein, das Bild zu speichern, das der Benutzer in die UIImageView im Dokumentenordner der Anwendung platziert und es dann abrufen und in einem anderen UIImageView für Anzeigen platzieren kann, wenn der Benutzer diese Ansicht auf den Stapel drückt. Jede Hilfe wird sehr geschätzt!

War es hilfreich?

Lösung

Es ist alles gut, Mann. Schaden Sie selbst oder anderen nicht.

Sie möchten diese Bilder wahrscheinlich nicht in Kerndaten speichern, da sich dies auf die Leistung auswirken kann, wenn der Datensatz zu groß wird. Besser die Bilder in Dateien schreiben.

NSData *pngData = UIImagePNGRepresentation(image);

Dadurch wird PNG -Daten des Bildes herausgebracht, das Sie aufgenommen haben. Von hier aus können Sie es in eine Datei schreiben:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name
[pngData writeToFile:filePath atomically:YES]; //Write the file

Das Lesen später funktioniert genauso. Bauen Sie den Weg so auf, wie wir es gerade oben getan haben, dann:

NSData *pngData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:pngData];

Was Sie wahrscheinlich tun möchten, ist eine Methode zu erstellen, die Ihnen Pfadzeichenfolge für Sie erstellt, da Sie diesen Code nicht überall übertragen haben. Es könnte so aussehen:

- (NSString *)documentsPathForFileName:(NSString *)name
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);  
    NSString *documentsPath = [paths objectAtIndex:0];

    return [documentsPath stringByAppendingPathComponent:name]; 
}

Hoffe das ist hilfreich.

Andere Tipps

Swift 3.0 Version

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString

let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object
let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG

do{
    try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG
}catch let error{
    print(error.localizedDescription)
}
#pragma mark == Save Image To Local Directory

-(void)saveImageToDocumentDirectoryWithImage: (UIImage *)capturedImage {
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/images"];

//Create a folder inside Document Directory
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

NSString *imageName = [NSString stringWithFormat:@"%@/img_%@.png", dataPath, [self getRandomNumber]] ;
// save the file
if ([[NSFileManager defaultManager] fileExistsAtPath:imageName]) {
    // delete if exist
    [[NSFileManager defaultManager] removeItemAtPath:imageName error:nil];
}

NSData *imageDate = [NSData dataWithData:UIImagePNGRepresentation(capturedImage)];
[imageDate writeToFile: imageName atomically: YES];
}

#pragma mark
#pragma mark == Generate Random Number
-(NSString *)getRandomNumber{
NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); // returned as a double
long digits = (long)time; // this is the first 10 digits
int decimalDigits = (int)(fmod(time, 1) * 1000); // this will get the 3 missing digits
//long timestamp = (digits * 1000) + decimalDigits;
NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
return timestampString;
}

Das ist Fangming Nings Antwort für Swift 4.2, aktualisiert mit a Empfohlene und schweichere Methode zum Abrufen des Dokumentverzeichnispfads und mit besserer Dokumentation. Gutschriften für die neue Methode.

guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
    return
}

//Using force unwrapping here because we're sure "1.jpg" exists. Remember, this is just an example.
let img = UIImage(named: "1.jpg")!

// Change extension if you want to save as PNG.
let imgPath = documentDirectoryPath.appendingPathComponent("1.jpg")

do {
    //Use .pngData() if you want to save as PNG.
    //.atomic is just an example here, check out other writing options as well. (see the link under this example)
    //(atomic writes data to a temporary file first and sending that file to its final destination)
    try img.jpegData(compressionQuality: 1)?.write(to: imgPath, options: .atomic)
} catch {
    print(error.localizedDescription)
}

Schauen Sie sich hier alle möglichen Optionen für Daten schreiben.

In Swift:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true)
if let path = paths[0]?.stringByAppendingPathComponent(imageName) {
    do {
        try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic)
    } catch {
        return
    }
}

Swift 4 mit Erweiterung

extension UIImage{

func saveImage(inDir:FileManager.SearchPathDirectory,name:String){
    guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else {
        return
    }
    let img = UIImage(named: "\(name).jpg")!

    // Change extension if you want to save as PNG.
    let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString)
    do {
        try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic)
    } catch {
        print(error.localizedDescription)
    }
  }
}

Nutzungsbeispiel

 image.saveImage(inDir: .documentDirectory, name: "pic")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top