web-dev-qa-db-ja.com

ローカルパスから画像をロードする方法ios Swift(by by 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.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)
19
Jack.Right

フォルダ/ B2A1EE50- ...は、アプリケーションを実行するたびに変わります。

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

私にとってうまくいくのは、fileNameを保存してドキュメントフォルダを取得することです。

Swift 3 +

ディレクトリフォルダーのゲッターを作成する

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
}
37
zsyesenko

また、これを試すことができます。

  1. パスが存在するかどうかを確認

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

  1. パスへのURLを作成

let url = NSURL(string: imageUrlPath)

  1. RLにデータを作成

let data = NSData(contentsOfURL: url!)

  1. rlを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!)
}
9
Jimmy James

このコードは私のために働く

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
}
3
Pankaj Jangid

スウィフト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)
        }
3

このサンプルコードにより、誰かが入力する手間が省けます。

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

後でその画像を読むために...

.. UIImageViewのように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
Fattie

absoluteStringpathに置き換えます

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
iYoung