2017-05-04 242 views
9

用这个看起来没有关注的简单问题获得巨大的赏金。获取保存到照片相册的图像的文件名

在现代的iOS(2017),

这里其实是我知道只有这样,才能将图像保存到了iOS系统中的照片,并获得文件名/路径。

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.它在赛道条件下失败。

这是惊人的笨拙,它似乎令人担忧的方式有很多。

今天真的要走吗?

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

我认为你可以PHPhotoLibraryPHObjectPlaceholder做到这一点。

+0

PHPhotoLibrary ...什么地狱,我什至没有听说过这个! – Fattie

+0

https://developer.apple.com/reference/photos/phphotolibrary你可以在这里找到文档。 –

+0

对于未来的谷歌,我相信**但我不确定**这是正确的现代答案。 – 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:我试着用这个代码模拟器:============= = - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo :(NSDictionary *)info { NSURL * localUrl =(NSURL *)[info valueForKey:UIImagePickerControllerReferenceURL]; NSLog(@“image url%@”,localUrl.absoluteString); } ======,并得到像这样的东西:image url assets-library://asset/asset.JPG?id = ED7AC36B-A150-4C38-BB8C-B6D696F4F2ED&ext = JPG 告诉我,如果你需要它。 ^^ –

0

也许这是一种不同的方法,但这里是我在我的应用程序和我做“M满意吧:

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

相关问题