2011-02-10 22 views
19

UIImagePickerController'u kullanarak bir iPhone uygulaması var. sourceType olarak beniPhone - UIImagePickerController -> görüntüyü uygulama klasörüne kaydet

  • UIImagePickerControllerSourceTypePhotoLibrary
  • UIImagePickerControllerSourceTypeCamera
  • UIImagePickerControllerSourceTypeSavedPhotosAlbum

böylece kullanıcı bir fotoğraf yapmak veya fotoğraf veya kamera fotoğraflardan fotoğraf kitaplığından birini seçebilirsiniz var.

Görüntü, bir UIImageView içinde görüntülenecektir. Kullanıcı uygulamayı kapatırsa, resim kaydedilmelidir. Bu yüzden metin alanları için NSUserDefaults kullanıyorum. NSUSerDefaults içindeki görüntüyü NSData ile kaydetmenin iyi bir yolu olmadığını biliyorum, bu yüzden görüntüyü NSUserDefaults benzeri bir uygulama tarafından denetlenen bir klasöre kaydetmek/kopyalamak istiyorum.

Bunu nasıl yapabilirim? Onu kaydetmek istiyorum ve sonra dosyanın yolunu NSUserDefaults'a yazabilirim ve uygulamanın başlangıcında okuyabilirim.

Teşekkür ederiz şimdiden & Saygılarımızla.

cevap

47

Sen var UIImagePickerControllerDelegate temsilci uygulanması

- (void) imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    //obtaining saving path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"]; 

    //extracting image from the picker and saving it 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    if ([mediaType isEqualToString:@"public.image"]){ 
     UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
     NSData *webData = UIImagePNGRepresentation(editedImage); 
     [webData writeToFile:imagePath atomically:YES]; 
    } 
} 

aşağıdaki kodu kullanabilirsiniz kullanabilirsiniz tüm

+3

[info objectForKey: UIImagePickerControllerOriginalImage] ürününü kullanmak zorunda kaldım; UIImagePickerControllerEditedImage yerine –

+0

Tam olarak, düzenlemeye izin verilip verilmediğine bağlıdır, picker.allowsEditing = YES; – khunshan

+0

Bu, görüntünün png olduğunu (veya görüntünün png olarak kaydedilmesiyle ilgili olarak en azından önemsiz olduğunu varsayar) kabul eder. – Andy

8

kaydetmek istediğiniz dosya biçiminde bağlı olarak,

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

VEYA

[UIImageJPEGRepresentation(image) writeToFile:path atomically:YES]; 
3

Bu, UIImage'ı belge dizinine kaydetmek için kullanılan koddur. Sen didFinishPickingImage temsilci yönteminde bu kodu kullanabilirsiniz:

// Create paths to output images 
NSString *pngPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.png"]; 
NSString *jpgPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.jpg"]; 

// Write a UIImage to JPEG with minimum compression (best quality) 
// The value 'image' must be a UIImage object 
// The value '1.0' represents image compression quality as value from 0.0 to 1.0 
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES]; 

// Write image to PNG 
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; 

// Let's check to see if files were successfully written... 

// Create file manager 
NSError *error; 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 

// Point to Document directory 
NSString *documentsDirectory = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents"]; 

// Write out the contents of home directory to console 
NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]); 

DÜZENLEMEYİ

de kullanabilirsiniz:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

Başvurunuz belge dizinin yolunu bulmak yerine kadar NSHomeDierctory.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    //obtaining saving path 
    let fileManager = FileManager.default 
    let documentsPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first 
    let imagePath = documentsPath?.appendingPathComponent("image.jpg") 

    // extract image from the picker and save it 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     try! UIImageJPEGRepresentation(pickedImage, 0.0)?.write(to: imagePath!) 
    } 
    self.dismiss(animated: true, completion: nil)   
} 

Swift 3.0

için

+0

teşekkürler! Mükemmel çalışıyor! –

+0

@iHS api'den görüntüleri almayı ve uygulamada saklamanızı istedim. Görüntüleri kaydetmek için aynı kodu kullanabilir miyim? – arshad

1

Güncelleme knuku cevabı burada görüntü jpeg olarak kaydedilir ama aynı zamanda png olarak kaydedebilirsiniz. En iyi kullanım 1.0 almak istiyorsanız 0.0 parametresi sıkıştırma anlamına gelir ve en düşük kalite.

İlgili konular