Simpan Gambar Ke Folder Dokumen Aplikasi Dari UIView Di IOS

114

Saya memiliki UIImageView yang memungkinkan pengguna untuk menempatkan dan menahan gambar hingga dapat disimpan. Masalahnya adalah, saya tidak tahu bagaimana sebenarnya menyimpan dan mengambil gambar yang telah saya tempatkan dalam tampilan.

Saya telah mengambil dan menempatkan gambar di UIImageView seperti ini:

//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];
}

Ini menampilkan gambar yang dipilih di UIImageView saya dengan baik, tetapi saya tidak tahu bagaimana menyimpannya. Saya menyimpan semua bagian tampilan lainnya (sebagian besar UITextfield) di Core Data. Saya telah mencari dan mencari, dan mencoba banyak bit kode yang disarankan orang, tetapi saya tidak memasukkan kode dengan benar, atau saran tersebut tidak berfungsi dengan cara saya menyiapkan kode saya. Sepertinya yang pertama. Saya ingin menyimpan gambar di UIImageView menggunakan tindakan yang sama (tombol simpan) yang saya gunakan untuk menyimpan teks di UITextFields. Inilah cara saya menyimpan info UITextField saya:

// Handle Save Button
- (void)save {

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

Seperti yang saya katakan sebelumnya, saya telah mencoba beberapa metode untuk membuat ini bekerja, tetapi tidak dapat memahaminya. Untuk pertama kalinya dalam hidup saya, saya ingin menyebabkan kerusakan fisik pada benda mati, tetapi saya berhasil menahan diri.

Saya ingin dapat menyimpan gambar yang ditempatkan pengguna ke dalam UIImageView di folder dokumen aplikasi, dan kemudian dapat mengambilnya dan menempatkannya di UIImageView lain untuk ditampilkan saat pengguna mendorong tampilan tersebut ke tumpukan. Bantuan apa pun sangat dihargai!

lupa
sumber

Jawaban:

341

Semuanya baik-baik saja. Jangan merugikan diri sendiri atau orang lain.

Anda mungkin tidak ingin menyimpan gambar ini dalam Data Inti, karena hal itu dapat memengaruhi kinerja jika kumpulan data bertambah besar. Lebih baik menulis gambar ke file.

NSData *pngData = UIImagePNGRepresentation(image);

Ini menarik data PNG dari gambar yang telah Anda ambil. Dari sini, Anda dapat menulisnya ke file:

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

Cara membacanya nanti juga sama. Bangun jalur seperti yang baru saja kita lakukan di atas, lalu:

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

Apa yang mungkin ingin Anda lakukan adalah membuat metode yang membuat string jalur untuk Anda, karena Anda tidak ingin kode itu berserakan di mana-mana. Ini mungkin terlihat seperti ini:

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

    return [documentsPath stringByAppendingPathComponent:name]; 
}

Semoga bermanfaat.

Danilo Campos
sumber
2
benar-benar benar - hanya ingin menyebutkan Panduan Penyimpanan Apple jadi BERGANTUNG pada sifat gambar, itu harus disimpan di bawah Cache
Daij-Djan
Saya mengikuti saran & kode Anda. tetapi tidak muncul di bagian foto. Bagaimana ini bisa terjadi?
NovusMobile
@DaniloCampos Bagaimana cara membuat folder di dalam Direktori Dokumen dan kemudian menyimpan file di dalam folder itu?
Pradeep Reddy Kypa
3

Versi Swift 3.0

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)
}
Fangming
sumber
2

Ini adalah jawaban Fangming Ning untuk Swift 4.2 , diperbarui dengan metode Swifty yang disarankan dan lebih banyak untuk mengambil jalur direktori dokumen dan dengan dokumentasi yang lebih baik. Penghargaan untuk Fangming Ning untuk metode baru juga.

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

Lihat semua kemungkinan opsi Penulisan data di sini.

Tamás Sengel
sumber
Apakah ini benar? Selama dalam jawaban untuk pertanyaan lain di sini saya menemukan bahwa fileURLWithPathbersama dengan absoluteStringitu salah.
dumbledad
@dumbledad Terima kasih atas informasinya, saya telah memperbarui jawaban saya dan juga menulis ulang kode untuk Swift 4.2.
Tamás Sengel
2
#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 - 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;
}
Mannam Brahmam
sumber
1

Swift 4 dengan ekstensi

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

Contoh penggunaan

 image.saveImage(inDir: .documentDirectory, name: "pic")
levin varghese
sumber
0

Di 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
    }
}
NatashaTheRobot
sumber