如何从本地路径加载图像ios swift(按路径)

问题描述 投票:18回答:7

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

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

 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)
ios swift image nsdocumentdirectory
7个回答
34
投票

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

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

对我有用的是存储fileName和获取文档文件夹。

斯威夫特3 +

为目录文件夹创建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 = UIImageJPEGRepresentation(image, 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
}

9
投票

你也可以尝试这个。

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

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

  1. 创建路径的URL

let url = NSURL(string: imageUrlPath)

  1. 为您创建数据URL

let data = NSData(contentsOfURL: url!)

  1. 将网址绑定到您的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
投票

这段代码适合我

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
}

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)

1
投票

此示例代码可能会节省某人打字,

在您自己的目录中写一个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中的UIImage

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

1
投票

斯威夫特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)
        }

-2
投票

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

2.cell.image.sd_setIndicatorStyle(.gray)

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

© www.soinside.com 2019 - 2024. All rights reserved.