আইওএস-এ ইউআইভিউ থেকে অ্যাপ্লিকেশন ডকুমেন্টস ফোল্ডারে একটি চিত্র সংরক্ষণ করুন


114

আমার কাছে একটি ইউআইআইমেজভিউ রয়েছে যা কোনও ব্যবহারকারী এটি সংরক্ষণ না করা অবধি কোনও চিত্র স্থাপন এবং ধরে রাখতে দেয়। সমস্যাটি হচ্ছে, আমি যে চিত্রটি দেখিয়েছি তা কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করতে পারি তা আমি বুঝতে পারি না।

আমি ছবিটি পুনরুদ্ধার করে এবং এটির মতো ইউআইআইমেজভিউতে রেখেছি:

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

এটি আমার ইউআইএমেজভিউতে নির্বাচিত চিত্রটি ঠিকঠাক প্রদর্শন করে তবে কীভাবে এটি সংরক্ষণ করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই। আমি কোর ডেটাতে অন্য সমস্ত দর্শন (বেশিরভাগ ইউআইটিেক্সটফিল্ড) সংরক্ষণ করছি। আমি অনুসন্ধান করেছি এবং অনুসন্ধান করেছি এবং লোকেদের পরামর্শ মতো কোডের অনেকগুলি বিট চেষ্টা করেছি, তবে হয় আমি কোডটি সঠিকভাবে প্রবেশ করছি না, বা এই পরামর্শগুলি আমার কোড সেট আপ করার সাথে কাজ করে না। এটা সম্ভবত প্রাক্তন। আমি ইউআইআইএজভিউ ভিউতে একই ক্রিয়াটি ব্যবহার করে ছবিটি সংরক্ষণ করতে চাই (একটি সেভ বোতাম) আমি ইউআইটিেক্সটফিল্ডগুলিতে পাঠ্যটি সংরক্ষণ করতে ব্যবহার করছি। আমি এখানে আমার ইউআইটিেক্সটফিল্ডের তথ্য সংরক্ষণ করছি:

// Handle Save Button
- (void)save {

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

যেমনটি আমি আগে বলেছি, এটি কাজ করার জন্য আমি বেশ কয়েকটি পদ্ধতির চেষ্টা করেছি, তবে এটি উপলব্ধি করতে পারি না। আমার জীবনে প্রথমবারের মতো আমি কোনও জড় পদার্থের শারীরিক ক্ষতি করতে চেয়েছিলাম তবে আমি নিজেকে সংযত করতে পেরেছি।

আমি অ্যাপ্লিকেশনটির নথি ফোল্ডারে ব্যবহারকারীর চিত্রগুলি ইউআইআইমেজভিউতে সংরক্ষণ করতে সক্ষম হতে চাই এবং তারপরে এটি পুনরুদ্ধার করতে এবং প্রদর্শনীর জন্য অন্য ইউআইআইমেজভিউতে রাখতে সক্ষম হব যখন ব্যবহারকারী সেই দৃশ্যটি স্ট্যাকের দিকে ঠেলে দেয়। কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়!

উত্তর:


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
সম্পূর্ণ সঠিক - কেবল চিত্রগুলির প্রকৃতির উপর নির্ভর করে অ্যাপল স্টোরেজ গাইডলাইনগুলি উল্লেখ করতে চাই, এটি
ক্যাশের

আমি আপনার পরামর্শ এবং কোড অনুসরণ করেছি। তবে এটি ফটো বিভাগে প্রদর্শিত হচ্ছে না। এটা কিভাবে হল?
নভাসমোবাইল

@ ড্যানিলো ক্যাম্পোস কীভাবে ডকুমেন্টস ডিরেক্টরিতে একটি ফোল্ডার তৈরি করবেন এবং সেই ফোল্ডারের ভিতরে ফাইলটি সংরক্ষণ করবেন?
প্রদীপ রেড্ডি কিপা

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

এটি সুইফট ৪.২- এর জন্য ফ্যাংমিং নিংয়ের উত্তর , ডকুমেন্ট ডিরেক্টরি পথটি পুনরুদ্ধার করার জন্য এবং আরও ভাল ডকুমেন্টেশনের সাথে প্রস্তাবিত এবং আরও সুইফটি পদ্ধতির সাথে আপডেট হয়েছে। নতুন পদ্ধতির জন্য ফ্যাংমিং নিংকেও ক্রেডিট।

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থাকা ভুল।
ডাম্বলডেড

@ ডাম্বলড্যাড তথ্যের জন্য আপনাকে ধন্যবাদ, আমি আমার উত্তর আপডেট করেছি এবং সুইফট ৪.২ এর জন্য কোডটিও আবার লিখেছি।
ট্যামস সেঞ্জেল

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
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.