将图像从 URL 保存到库,重命名并使用 Swift 共享它

Posted

技术标签:

【中文标题】将图像从 URL 保存到库,重命名并使用 Swift 共享它【英文标题】:Save image to library from URL, rename, and share it using Swift 【发布时间】:2017-01-13 19:07:33 【问题描述】:

我想将图像从我自己的 ios 应用程序分享到 Instagram,并且我在整个项目中使用 Kingfisher 来下载和缓存图像并在 UIImageViews 中显示它们,但这次我想做一些不同的事情。

基本上,我从 API 收到带有图片网址的响应,我想要

    使用 URL 将图像下载到库中

对于 Objective-C 使用有很多关于此的问题

 UIImageWriteToSavedPhotosAlbum 

但我使用的是 Swift。

    使用 .igo 扩展名重命名(instagram 独有)

不确定如何处理,取决于数字 1。

    然后我可以通过类似的方式分享它

            let image = UIImage(named: "downloadedImage")
            let objectsToShare: [AnyObject] = [ image! ]
            let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
            activityViewController.popoverPresentationController?.sourceView = self.view
    
    
            activityViewController.excludedActivityTypes = [ UIActivityTypeAirDrop, UIActivityTypePostToFacebook ]
    
    
            self.presentViewController(activityViewController, animated: true, completion: nil)
    

或者我可以使用 Instagram 挂钩:

 instagram://library?LocalIdentifier=\(localID)

这方面的文档对于 Swift 来说特别稀缺。我该怎么办?我只需要朝着正确的方向前进。

【问题讨论】:

一定要存到相册,还是直接存到本地存储文件夹? @TheValyreanGroup 我不知道该怎么做。只要我可以重命名图像的扩展名,这也可以工作 我刚刚发布了一个希望对您有所帮助的答案。 【参考方案1】:

听起来您已经知道如何使用 Kingfisher 并从 URL 中检索 UIImage。所以我要提供的是将图像保存到文档目录并检索它以共享的信息。

检索正确的目录 URL

func getDocumentsDirectory() -> URL 
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory

将图像保存到该目录

func saveImage (image: UIImage, filename: String )
    print("Saving image with name \(filename)")
    if let data = UIImagePNGRepresentation(image) 
        let fullURL = getDocumentsDirectory().appendingPathComponent(filename)
        try? data.write(to: fullURL)
    

从目录中检索图像

func loadImageFromName(name: String) -> UIImage? 
    print("Loading image with name \(name)")
    let path = getDocumentsDirectory().appendingPathComponent(name).path

    let image = UIImage(contentsOfFile: path)

    if image == nil 

        print("missing image at: \(path)")
    
    return image

分享图片

func share(shareText shareText:String?,shareImage:UIImage?)
   var objectsToShare = [AnyObject]()
   if let shareTextObj = shareText
      objectsToShare.append(shareTextObj)
   
   if let shareImageObj = shareImage
      objectsToShare.append(shareImageObj)
   

   if shareText != nil || shareImage != nil
      let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
      activityViewController.popoverPresentationController?.sourceView = self.view

      present(activityViewController, animated: true, completion: nil)
   else
     print("There is nothing to share")
   

如何使用

let img: UIImage = UIImage() // Replace this with your image from your URL
saveImage(image: img, filename: "newImage.igo") //This is where you change your extension name

let newImage: UIImage = loadImageFromName(name: "newImage.igo") //Retrieve your image with the correct extension

share(shareText: "Image going to Instagram", shareImage: newImage) //Present Activity VC.

正如 DFD 指出的那样,您可以从共享 VC 中排除某些项目,只允许您需要的内容。

【讨论】:

我最终稍微更改了代码,使用来自 Kingfisher 的 ImageDownloader 和 Instagram 挂钩进行发布,但执行的流程与您在此处解释的流程几乎相同。【参考方案2】:

在我的导航控制器中,我将 UIBarButtonItem 设置为系统项“操作”。然后我创建了以下 IBAction 代码:

@IBAction func shareImage(_ sender: UIBarButtonItem) 
    let context = CIContext()
    let final = context.createCGImage(imgFinished, from: imgFinished.extent)
    let shareImage = UIImage(cgImage: final!)
    let vc = UIActivityViewController(activityItems: [shareImage], applicationActivities: [])
    vc.excludedActivityTypes =  [
        UIActivityType.airDrop,
        UIActivityType.assignToContact,
        UIActivityType.addToReadingList,
        //UIActivityType.copyToPasteboard,
        //UIActivityType.mail,
        //UIActivityType.message,
        //UIActivityType.openInIBooks,
        //UIActivityType.postToFacebook,
        //UIActivityType.postToFlickr,
        UIActivityType.postToTencentWeibo,
        //UIActivityType.postToTwitter,
        UIActivityType.postToVimeo,
        UIActivityType.postToWeibo,
        UIActivityType.print,
        //UIActivityType.saveToCameraRoll
    ]
    present(vc,
            animated: true,
            completion: nil)
    vc.popoverPresentationController?.sourceView = self.view
    vc.completionWithItemsHandler = (activity, success, items, error) in
    

excludedActivityTypes 列表是可用 UIActivityTypes 的完整/详尽列表,该列表从代码完成或命令单击 UIActivity 类型并遍历生成的结构中收集。我取消注释我希望排除的那些 - 但将它们保留以供将来快速参考。这将为您提供所需的弹出窗口。

【讨论】:

以上是关于将图像从 URL 保存到库,重命名并使用 Swift 共享它的主要内容,如果未能解决你的问题,请参考以下文章

将图像保存到库时不显示 HUD 微调器

如何在上传过程中重命名图像文件

PHP和Ajax将文件路径上传到Mysql并将重命名的图像保存到文件夹失败

Facebook Marketing API:将图片上传到库提供了一个 URL

使用 fs 在 multer 中重命名上传的图像

从字符串 URL 数组下载图像并保存到文件?