【问题标题】:how to load image from local path ios swift (by path)如何从本地路径 ios swift 加载图像(按路径)
【发布时间】:2016-10-01 04:15:22
【问题描述】:

在我的应用程序中,我将图像存储在本地存储中,并将该图像的路径保存在我的数据库中。如何从该路径加载图像?

这是我用来保存图像的代码:

 let myimage : UIImage = UIImage(data: data)!
            let fileManager = NSFileManager.defaultManager()
            let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
            let documentDirectory = urls[0] as NSURL


            print(documentDirectory)
            let currentDate = NSDate()

            let dateFormatter = NSDateFormatter()
            dateFormatter.dateStyle = .NoStyle
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            let convertedDate = dateFormatter.stringFromDate(currentDate)
            let imageURL = documentDirectory.URLByAppendingPathComponent(convertedDate)
            imageUrlPath  = imageURL.absoluteString
            print(imageUrlPath)
            UIImageJPEGRepresentation(myimage,1.0)!.writeToFile(imageUrlPath, atomically: true)

这是我的图像存储的路径

file:///var/mobile/Containers/Data/Application/B2A1EE50-D800-4BB0-B475-6C7F210C913C/Documents/2016-06-01%2021:49:32

这就是我尝试检索图像的方式,但它没有显示任何内容。

let image : String = person?.valueForKey("image_local_path") as! String
        print(person!.valueForKey("image_local_path")! as! String)
        cell.img_message_music.image = UIImage(contentsOfFile: image)

【问题讨论】:

  • 这一行:imageUrlPath = imageURL.absoluteString 需要是imageUrlPath = imageURL.path
  • 顺便说一句,你不应该把data转换成UIImage,然后再用UIImageJPEGRepresentation转换回NSData。只需保存原始的data
  • 我处于相同的场景中,请注意,每次运行/构建/更新应用程序时,您的 B2A1EE50xx 文件夹都会更改,如下面的@zsyesenko 所述。所以你需要写imageUrl而不是imageUrlPath并保存你的文件名(convertedDate在你的情况下)不是路径

标签: ios swift image nsdocumentdirectory


【解决方案1】:

absoluteString 替换为path

let myimage : UIImage = UIImage(data: data)!
        let fileManager = NSFileManager.defaultManager()
        let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        let documentDirectory = urls[0] as NSURL


        print(documentDirectory)
        let currentDate = NSDate()

        let dateFormatter = NSDateFormatter()
        dateFormatter.dateStyle = .NoStyle
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let convertedDate = dateFormatter.stringFromDate(currentDate)
        let imageURL = documentDirectory.URLByAppendingPathComponent(convertedDate)
        imageUrlPath  = imageURL.path
        print(imageUrlPath)
        UIImageJPEGRepresentation(myimage,1.0)!.writeToFile(imageUrlPath, atomically: true)

【讨论】:

    【解决方案2】:

    你也可以试试这个。

    1. 检查你的路径是否存在

    if NSFileManager.defaultManager().fileExistsAtPath(imageUrlPath) {}

    1. 为您的路径创建一个 URL

    let url = NSURL(string: imageUrlPath)

    1. 为您的 URL 创建数据

    let data = NSData(contentsOfURL: url!)

    1. 将 url 绑定到您的 imageView

    imageView.image = UIImage(data: data!)

    最终代码

    if NSFileManager.defaultManager().fileExistsAtPath(imageUrlPath) {
        let url = NSURL(string: imageUrlPath)
        let data = NSData(contentsOfURL: url!)
        imageView.image = UIImage(data: data!)
    }
    

    【讨论】:

      【解决方案3】:

      文件夹 /B2A1EE50- ... 每次运行应用程序时都会更改。

      ../Application/B2A1EE50-D800-4BB0-B475-6C7F210C913C/Documents/..
      

      对我有用的是存储文件名并获取文档文件夹。

      斯威夫特 5

      为目录文件夹创建getter

      var documentsUrl: URL {
          return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
      }
      

      保存图片:

      private func save(image: UIImage) -> String? {
          let fileName = "FileName"
          let fileURL = documentsUrl.appendingPathComponent(fileName)
          if let imageData = image.jpegData(compressionQuality: 1.0) {
             try? imageData.write(to: fileURL, options: .atomic)
             return fileName // ----> Save fileName
          }
          print("Error saving image")
          return nil
      }
      

      加载图片:

      private func load(fileName: String) -> UIImage? {
          let fileURL = documentsUrl.appendingPathComponent(fileName)
          do {
              let imageData = try Data(contentsOf: fileURL)
              return UIImage(data: imageData)
          } catch {
              print("Error loading image : \(error)")
          }
          return nil
      }
      

      【讨论】:

        【解决方案4】:

        此示例代码可能会节省一些人的打字时间,

        在您自己的目录中将 UIImage 写入磁盘:

        IM = UIImage, your image. for example, IM = someUIView.image or from the camera
        
        let newPhotoFileName = randomNameString() + ".jpeg"
        let imagePath = checkedImageDirectoryStringPath() + "/" + newPhotoFileName
        
        let imData = UIImageJPEGRepresentation(IM, 0.20)
        FileManager.default.createFile(atPath: imagePath, contents: imData, attributes: nil)
        
        print("saved at filename \(newPhotoFileName)")
        

        稍后阅读该图像...

        .. 并将其转换回 UIImage,就像在 UIImageView 中一样

        NAME = that filename, like jahgfdfs.jpg
        
        let p = checkedImageDirectoryStringPath() + "/" + NAME
        devCheckExists(fullPath: p)
        
        var imageData: Data? = nil
        do {
            let u = URL(fileURLWithPath: p)
            imageData = try Data(contentsOf: u)
        }
        catch {
            print("catastrophe loading file?? \(error)")
            return
        }
        
        // and then to "make that an image again"...
        
        imageData != nil {
        
            picture.image = UIImage(data: imageData!)
            print("that seemed to work")
        }
        else {
        
            print("the imageData is nil?")
        }
        
        // or for example...
        
        Alamofire.upload(
            multipartFormData: { (multipartFormData) in
                multipartFormData.append(imageData!,
                   withName: "file", fileName: "", mimeType: "image/jpeg")
            ...
        

        这里是上面用到的非常方便的函数...

        func checkedImageDirectoryStringPath()->String {
        
            // create/check OUR OWN IMAGE DIRECTORY for use of this app.
        
            let paths = NSSearchPathForDirectoriesInDomains(
                              .documentDirectory, .userDomainMask, true)
        
            if paths.count < 1 {
                print("some sort of disaster finding the our Image Directory - giving up")
                return "x"
                // any return will lead to disaster, so just do that
                // (it will then gracefully fail when you "try" to write etc)
            }
        
            let docDirPath: String = paths.first!
            let ourDirectoryPath = docDirPath.appending("/YourCompanyName")
            // so simply makes a directory called "YourCompanyName"
            // which will be there for all time, for your use
        
            var ocb: ObjCBool = true
            let exists = FileManager.default.fileExists(
                          atPath: ourDirectoryPath, isDirectory: &ocb)
        
            if !exists {
                do {
                    try FileManager.default.createDirectory(
                            atPath: ourDirectoryPath,
                            withIntermediateDirectories: false,
                            attributes: nil)
        
                    print("we did create our Image Directory, for the first time.")
                    // never need to again
                    return ourDirectoryPath
                }
                catch {
                    print(error.localizedDescription)
                    print("disaster trying to make our Image Directory?")
                    return "x"
                    // any return will lead to disaster, so just do that
                }
            }
        
            else {
        
                // already exists, as usual.
                return ourDirectoryPath
            }
        }
        

        func randomNameString(length: Int = 7)->String{
        
            enum s {
                static let c = Array("abcdefghjklmnpqrstuvwxyz12345789".characters)
                static let k = UInt32(c.count)
            }
        
            var result = [Character](repeating: "a", count: length)
        
            for i in 0..<length {
                let r = Int(arc4random_uniform(s.k))
                result[i] = s.c[r]
            }
        
            return String(result)
        }
        

        func devCheckExists(fullPath: String) {
        
            var ocb: ObjCBool = false
            let itExists = FileManager.default.fileExists(atPath: fullPath, isDirectory: &ocb)
            if !itExists {
                // alert developer. processes will fail at next step
                print("\n\nDOES NOT EXIST\n\(fullPath)\n\n")
            }
        }
        

        【讨论】:

          【解决方案5】:

          此代码适用于我

          func getImageFromDir(_ imageName: String) -> UIImage? {
          
              if let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
                  let fileURL = documentsUrl.appendingPathComponent(imageName)
                  do {
                      let imageData = try Data(contentsOf: fileURL)
                      return UIImage(data: imageData)
                  } catch {
                      print("Not able to load image")
                  }
              }
              return nil
          }
          

          【讨论】:

            【解决方案6】:

            1.cell.image.sd_setShowActivityIndi​​catorView(true)

            2.cell.image.sd_setIndicatorStyle(.gray)

            3.cell.image.image = UIImage(contentsOfFile: urlString!)

            【讨论】:

            • 不要将不是图像的东西命名为“图像”。在您的示例中,您最终会得到荒谬的命名,例如“image.image”。
            • 你跑题了,伙计:-/
            【解决方案7】:

            斯威夫特 4:

            if FileManager.default.fileExists(atPath: imageUrlPath) {
                        let url = NSURL(string: imageUrlPath)
                        let data = NSData(contentsOf: url! as URL)
            
                        chapterImage.image = UIImage(data: data! as Data)
                    }
            

            【讨论】:

              【解决方案8】:

              这对我有用,我认为这是一种快速而干净的方式。

              Swift 5.0

              let fileManager = NSFileManager.defaultManager()
              let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
              let documentDirectory = urls[0] as NSURL
              
              print(documentDirectory)
              let currentDate = NSDate()
              
              let dateFormatter = NSDateFormatter()
              dateFormatter.dateStyle = .NoStyle
              dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
              let convertedDate = dateFormatter.stringFromDate(currentDate)
              let imageURL = documentDirectory.URLByAppendingPathComponent(convertedDate)
              let imageData = try? Data(contentsOf: imageUrl)
              let image = UIImage(data: imageData!)
              

              其中“imageUrl”是文档文件夹中 imageURL 的值。 “图像”是您可以在任何需要的地方使用的结果图像。

              【讨论】:

                猜你喜欢
                • 2018-11-28
                • 1970-01-01
                • 1970-01-01
                • 2011-07-23
                • 1970-01-01
                • 1970-01-01
                • 2011-04-30
                • 1970-01-01
                • 2017-08-15
                相关资源
                最近更新 更多