2017-05-04 14 views
9

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

आधुनिक आईओएस (2017) में,

यहाँ वास्तव में एक ही रास्ता मैं जानता हूँ कि आईओएस फ़ोटो प्रणाली के लिए एक छवि बचाने के लिए, और फ़ाइल नाम/पथ प्राप्त करने के लिए है।

import UIKit 
import Photos 

func saveTheImage...() { 

    UIImageWriteToSavedPhotosAlbum(yourUIImage, self, 
     #selector(Images.image(_:didFinishSavingWithError:contextInfo:)), 
     nil) 
} 

func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { 
    guard error == nil else { 
     print("Couldn't save the image!") 
     return 
    } 
    doGetFileName() 
} 

func doGetFileName() { 
    let fo: PHFetchOptions = PHFetchOptions() 
    fo.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
    let r = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fo) 
    if let mostRecentThingy = r.firstObject { 

     PHImageManager.default().requestImageData(
      for: mostRecentThingy, 
      options: PHImageRequestOptions(), 
      resultHandler: { (imagedata, dataUTI, orientation, info) in 

       if info!.keys.contains("PHImageFileURLKey") { 
        let path = info!["PHImageFileURLKey"] as! NSURL 

        print("Holy cow. The path is \(path)") 
       } 
       else { print("bizarre problem") } 
      }) 

    } 
    else { print("unimaginable catastrophe") } 
} 

इस के साथ दो समस्याएं हैं:

1. WTH?!?

2. यह दौड़ का मैदान की स्थिति में विफल रहता है।

यह आश्चर्यजनक बोझल है, और यह कई तरीकों से में worrysome लगता है।

यह वास्तव में आज जाने का रास्ता, है?

+0

क्या आपको वास्तव में यूआरएल की आवश्यकता है? क्या आप संबंधित 'PHObject' की 'localIdentifier' प्रॉपर्टी का भी उपयोग कर सकते हैं? –

उत्तर

1
extension PHPhotoLibrary { 

    func save(imageData: Data, withLocation location: CLLocation?) -> Promise<PHAsset> { 
     var placeholder: PHObjectPlaceholder! 
     return Promise { fullfil, reject in 
      performChanges({ 
       let request = PHAssetCreationRequest.forAsset() 
       request.addResource(with: .photo, data: imageData, options: .none) 
       request.location = location 
       placeholder = request.placeholderForCreatedAsset 
      }, completionHandler: { (success, error) -> Void in 
       if let error = error { 
        reject(error) 
        return 
       } 

       guard let asset = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: .none).firstObject else { 
        reject(NSError()) 
        return 
       } 

       fullfil(asset) 
      }) 
     } 
    } 
} 

मुझे लगता है कि आप PHPhotoLibrary और PHObjectPlaceholder के साथ ऐसा कर सकते हैं।

+0

PHPhotoLibrary ... क्या नरक है, मैंने इसके बारे में भी नहीं सुना है !! – Fattie

+0

https://developer.apple.com/reference/photos/phphotolibrary आप यहां दस्तावेज़ ढूंढ सकते हैं। –

+0

भावी googlers के लिए, मुझे विश्वास है ** लेकिन मुझे यकीन नहीं है ** यह सही आधुनिक जवाब है। – Fattie

2

तुम बस ताकि आप कैमरे से छवि प्राप्त करने और अपने पथ के साथ इसे सहेज सकते हैं प्रोग्राम के रूप में छवि को बचाया,: मैं अपने एप्लिकेशन और मैं में क्या कर रहा है

//save image in Document Derectory 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSLog(@"Get Path : %@",documentsDirectory); 

     //create Folder if Not Exist 
     NSError *error = nil; 
     NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/YourFolder"]; 

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

     NSString *[email protected]"YourPhotoName"; 
     NSString* path= [dataPath stringByAppendingString:[NSString stringWithFormat:@"/%@.png",yourPhotoName]]; 
     NSData* imageData = UIImagePNGRepresentation(imageToSaved); //which got from camera 

     [imageData writeToFile:path atomically:YES]; 

     imagePath = path; 
     NSLog(@"Save Image Path : %@",imagePath); 
+0

हाय दांग, मैं रास्ते की खोज के लिए *** अगर यह एप्पल फोटो एलबम प्रणाली *** – Fattie

+0

@Fattie में है कोशिश: मैं इस कोड के साथ सिम्युलेटर के साथ करने की कोशिश की: ============= = - (शून्य) imagePickerController: (UIImagePickerController *) पिकर किया गया FinishPickingMediaWithInfo: (NSDictionary *) जानकारी { NSURL * localUrl = (NSURL *) [जानकारी मानफोरकी: UIImagePickerControllerReferenceURL]; एनएसएलओजी (@ "छवि यूआरएल% @", localUrl.absoluteString); } ====== और मिला कुछ की तरह: छवि यूआरएल संपत्ति-पुस्तकालय: //asset/asset.JPG आईडी = ED7AC36B-A150-4C38-BB8C-B6D696F4F2ED और ext = जेपीजी मुझे बताओ अगर आप इसे की जरूरत है। ^^ –

0

हो सकता है कि यह एक अलग दृष्टिकोण है, लेकिन यहाँ 'इससे ​​संतुष्ट हूँ:

func saveImage(image: UIImage, name: String) { 

    var metadata = [AnyHashable : Any]() 
    let iptcKey = kCGImagePropertyIPTCDictionary as String 
    var iptcMetadata = [AnyHashable : Any]() 

    iptcMetadata[kCGImagePropertyIPTCObjectName as String] = name 
    metadata[iptcKey] = iptcMetadata 

    let library = ALAssetsLibrary() 

    library.writeImage(toSavedPhotosAlbum: image.cgImage, metadata: metadata) { url, error in 

     // etc... 
    } 
} 

आप ALAssetsLibrary का उपयोग नहीं करना चाहते हैं, तो आप शायद this answer में दिलचस्पी होगी।

संबंधित मुद्दे