IOS पर UIView से एप्लिकेशन दस्तावेज़ फ़ोल्डर के लिए एक छवि सहेजें


114

मेरे पास एक UIImageView है जो एक उपयोगकर्ता को एक छवि को रखने और रखने की अनुमति देता है जब तक कि इसे बचाया नहीं जा सकता। समस्या यह है, मैं यह पता नहीं लगा सकता कि वास्तव में मैंने जिस छवि को देखा है उसे कैसे सहेजा और पुनः प्राप्त किया जाए।

मैंने इमेज को UIImageView में इस तरह से पुनः प्राप्त और रखा है:

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

यह मेरे UIImageView में चयनित छवि को ठीक दिखाता है, लेकिन मुझे नहीं पता कि इसे कैसे बचाया जाए। मैं कोर डेटा में दृश्य के अन्य सभी टुकड़ों (ज्यादातर UITextfield) को बचा रहा हूं। मैंने खोजा और खोजा है, और कई बिट कोड की कोशिश की है जो लोगों ने सुझाए हैं, लेकिन या तो मैं कोड को सही ढंग से दर्ज नहीं कर रहा हूं, या उन सुझावों से काम नहीं करता जिस तरह से मैंने अपना कोड सेट किया है। यह पूर्व की संभावना है। मैं UIImageView में उसी कार्रवाई (एक सहेजें बटन) का उपयोग करके छवि को सहेजना चाहूंगा जो मैं UITextFields में पाठ को सहेजने के लिए उपयोग कर रहा हूं। यहां बताया गया है कि मैं अपनी UITextField जानकारी कैसे सहेज रहा हूं:

// Handle Save Button
- (void)save {

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

जैसा कि मैंने पहले कहा था, मैंने इसे काम करने के लिए कई तरीकों की कोशिश की है, लेकिन इस पर समझ नहीं मिल सकती है। मैंने अपने जीवन में पहली बार एक निर्जीव वस्तु को शारीरिक नुकसान पहुंचाना चाहा है, लेकिन मैं खुद को संयमित करने में कामयाब रहा हूं।

मैं एप्लिकेशन के दस्तावेज़ फ़ोल्डर में UIImageView में उपयोगकर्ता स्थानों को छवि को सहेजने में सक्षम होना चाहता हूं, और फिर इसे पुनर्प्राप्त करने में सक्षम हो सकता हूं और उपयोगकर्ता द्वारा स्टैक पर उस दृश्य को धक्का देने पर इसे दूसरे UIImageView में प्रदर्शित करने के लिए रख सकता हूं। कोई भी मदद बहुत ही सराहनीय होगी!

जवाबों:


341

यह सब अच्छा है, यार। अपना या दूसरों का नुकसान न करें।

आप शायद इन छवियों को कोर डेटा में संग्रहीत नहीं करना चाहते हैं, क्योंकि यह प्रदर्शन को प्रभावित कर सकता है यदि डेटा सेट बहुत बड़ा हो जाता है। छवियों को फ़ाइलों में लिखने के लिए बेहतर है।

NSData *pngData = UIImagePNGRepresentation(image);

यह आपके द्वारा कैप्चर की गई छवि का पीएनजी डेटा खींचता है। यहां से, आप इसे एक फ़ाइल में लिख सकते हैं:

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

बाद में इसे पढ़ना उसी तरह से काम करता है। पथ का निर्माण करें जैसे हमने अभी ऊपर किया, फिर:

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

आप शायद जो करना चाहते हैं, वह एक ऐसा तरीका है जो आपके लिए रास्ता बनाता है, क्योंकि आप नहीं चाहते कि कोड हर जगह फिसड्डी हो। यह इस तरह लग सकता है:

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

    return [documentsPath stringByAppendingPathComponent:name]; 
}

आशा है कि सहायक होगा।


2
पूरी तरह से सही - बस Apple स्टोरेज दिशानिर्देशों का उल्लेख करना चाहते हैं इसलिए छवियों की प्रकृति पर निर्भर करते हुए, इसे कैश में संग्रहीत किया जाना चाहिए
Daij-Djan

मैंने आपके सुझाव और कोड का पालन किया। लेकिन यह फ़ोटो अनुभागों में दिखाई नहीं दे रहा है। ये कैसे हुआ?
NovusMobile

@DaniloCampos दस्तावेज़ निर्देशिका के अंदर एक फ़ोल्डर कैसे बनाएँ और फिर उस फ़ोल्डर के अंदर फ़ाइल को सहेजें?
प्रदीप रेड्डी कीपा

3

स्विफ्ट 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)
}

2

यह स्विफ्ट 4.2 के लिए फैंगिंग निंग का जवाब है , जिसे दस्तावेज़ निर्देशिका पथ को प्राप्त करने और बेहतर प्रलेखन के साथ एक अनुशंसित और अधिक स्विफ्टी विधि के साथ अद्यतन किया गया है । नई विधि के लिए भी फिंगिंग निंग को श्रेय।

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

यहां सभी संभावित डेटा लेखन विकल्प देखें।


क्या ये सही है? एक अन्य प्रश्न के उत्तर में यहाँ मैंने पाया कि fileURLWithPathसाथ absoluteStringमें गलत है।
डंबलड

@dumbledad आपको जानकारी के लिए धन्यवाद, मैंने अपना उत्तर अपडेट कर लिया है और स्विफ्ट 4.2 के लिए भी कोड फिर से लिखा है।
तमसेन सेंगेल

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

1

विस्तार के साथ 4 स्विफ्ट

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

उदाहरण का उपयोग करें

 image.saveImage(inDir: .documentDirectory, name: "pic")

0

स्विफ्ट में:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true)
if let path = paths[0]?.stringByAppendingPathComponent(imageName) {
    do {
        try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic)
    } catch {
        return
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.