在Swift 3中,如何从路径或文件名创建UIImage?

5

我在我的应用程序文档目录中有一堆图片。我想在我的视图中加载其中的一张图片到UIImage中。这是我的做法:

myImage.image = UIImage(named: "image.jpg") // the file exist but this returns nil

我也尝试使用以下方式初始化图像:
myImage.image = UIImage(contentsOfFile: imagePath) //this also doesn't work but the path i got starts (at least in the sim) with file://

有人能提供建议吗?我在iOS编程方面有些新手。

谢谢。

编辑: imagePath来自于:

func getImgPath(name: String) -> String
{
    let documentsDirectory = self.getDocumentsDirectory()
    let fullpath = documentsDirectory.appendingPathComponent(name)
    return fullpath.absoluteString

}

可能 imagePath 不正确,请发布相关代码。 - Tj3n
myImage.image = UIImage(named: "image.jpg") 总是要用双引号来写字符串。 - Hakikat Singh
是的,抱歉我编辑了一下,但我将一个字符串(正确且文件存在)作为变量传递。 - Andrea
@paper1111,问题现在已经被编辑了,但之前并没有。 - Hakikat Singh
我打印出名称并且是正确的。确切地说,图像名称是“137.jpg”,在我的应用文档目录中该文件存在。我确定,因为我不断检查那个目录。 - Andrea
显示剩余5条评论
4个回答

15

这可能会有所帮助

let documentDirectory = FileManager.SearchPathDirectory.documentDirectory
let userDomainMask    = FileManager.SearchPathDomainMask.userDomainMask
let paths             = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)
if let dirPath        = paths.first
{
   let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent("name.png")
   let image    = UIImage(contentsOfFile: imageURL.path)
   // Do whatever you want with the image
}

1
这真的帮了很大的忙。非常感谢,我永远不会理解为什么Swift要这样设计...再次感谢! - Andrea
2
很高兴能帮到你。祝你好运。 - Maulik Bhuptani

5

尝试将您的图片添加到Assets.xcassets下。然后,您可以通过以下方式引用您的图片:

UIImage(named: 'yourImageName')

你可以方便地添加具有各种大小设置的图像。

1
我从互联网下载了图片,下载后是否可以将它们移动到Assets.xcassets中? - Andrea
1
@Andrea 嗯,不是的...在那种情况下,你需要将图像数据转换为 UIImage,然后再进行下载。 - user8567812

0

你可以按如下方式获取图像的路径:

let imagePath = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("image.jpg")

如果这不起作用,请检查您的文件名是否正确。

这不起作用。但是图片存在,名称正确……我在UIImage的contentsOfFile:初始化中使用了imagePath.absoluteString。 - Andrea

0

我明白如果你要从互联网下载图片,就需要将 URL 转换为 UIImage

    if let url = URL(string: "your url") {
        let data = try? Data(contentsOf: url)
        if let imageData = data {
            if let image = UIImage(data: imageData) {
                imageView.image = image
            }
        }
    }

如果我理解你的问题正确,这将是答案。


不,我在一个评论中提到我只下载了图片。我没有在问题中写这个原因是因为应用程序应该在没有连接的情况下工作,所以我先下载图片,然后只有在需要时才想访问它们。 - Andrea
好的,我现在明白了。请参考这个。这里将图像存储在“缓存”内存中。因此,即使没有连接,它也可以工作。希望这可以帮助到您。 - Austin Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接