如何在 Swift 中从文件夹中获取 UIImage 数组?

Posted

技术标签:

【中文标题】如何在 Swift 中从文件夹中获取 UIImage 数组?【英文标题】:How to get array of UIImage, from folder, in Swift? 【发布时间】:2016-05-23 22:32:55 【问题描述】:

我有一个像这样的普通Xcode项目...

请注意,有一个名为“images”的文件夹(它是一个实际文件夹,而不仅仅是一个组)。它包含 25 个“.png”图像。

我想要做的就是为每个图像制作一个 数组 UIimage

(或者甚至是图像名称或类似名称的数组,这很好 - 然后可以加载它们UIImage(named:

我如何获得该文件夹的“图像”?子文件夹“images/cars”呢?

我尝试了类似的方法,但什么也没找到...

override func viewDidLoad()
    
    let imageArray = NSBundle.mainBundle().URLsForResourcesWithExtension(
          "png", subdirectory: "images")
    print("test...")
    for n:NSURL in imageArray!
         print("found ..." ,n) 
    

【问题讨论】:

您能否确认图片已加载到应用程序包中? 看看这个答案:***.com/questions/30584992/… 【参考方案1】:

我们假设图像位于应用的资源包中。如果不是,您需要确保您的图像目录列在目标“构建阶段”的“复制捆绑资源”中。

编辑 这只是将图像复制到应用程序包中,如果您需要按照以下代码将文件夹复制到应用程序包中,请使用关注 *** question 进行正确设置。

这为我们提供了一组 URL,然后我们可以在需要时将其与 UIImage(data:) 和 NSData(contentsOfURL:) 一起使用来创建图像。

获取捆绑包的资源路径并附加图像目录,然后获取目录的内容。

     if let path = NSBundle.mainBundle().resourcePath 

        let imagePath = path + "/images"
        let url = NSURL(fileURLWithPath: imagePath)
        let fileManager = NSFileManager.defaultManager()

        let properties = [NSURLLocalizedNameKey,
                          NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey]

        do 
            let imageURLs = try fileManager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: properties, options:NSDirectoryEnumerationOptions.SkipsHiddenFiles)

            print("image URLs: \(imageURLs)")
            // Create image from URL
            var myImage =  UIImage(data: NSData(contentsOfURL: imageURLs[0])!)

         catch let error1 as NSError 
            print(error1.description)
        
    

【讨论】:

很棒的答案。这些图像肯定在“复制捆绑资源”中。但是那里没有文件夹(“复制捆绑资源”中根本没有文件夹 - 只有个别项目)。所以代码对我不起作用。它只是抛出错误...... 没关系 - 这是组织的选择。 但是我怎样才能将文件夹放入副本包资源中?我好像不能把它拖进去。 看到这个问题***.com/questions/10969555/…【参考方案2】:

您可以按照以下步骤下载它们:

    在finder中创建一个新文件夹并添加所有图像(或文件夹,... 一切)。

    更改文件夹名称+“.bundle”(例如:YourListImage -> YourListImage.bundle)。

    将文件夹添加到项目中。

    添加文件管理器扩展:

    extension FileManager 
        func getListFileNameInBundle(bundlePath: String) -> [String] 
    
            let fileManager = FileManager.default
            let bundleURL = Bundle.main.bundleURL
            let assetURL = bundleURL.appendingPathComponent(bundlePath)
            do 
                let contents = try fileManager.contentsOfDirectory(at: assetURL, includingPropertiesForKeys: [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey], options: .skipsHiddenFiles)
                return contents.map$0.lastPathComponent
            
            catch 
                return []
            
        
    
        func getImageInBundle(bundlePath: String) -> UIImage? 
            let bundleURL = Bundle.main.bundleURL
            let assetURL = bundleURL.appendingPathComponent(bundlePath)
            return UIImage.init(contentsOfFile: assetURL.relativePath)
        
    
    

    用途:

     let fm = FileManager.default
     let listImageName = fm.getListFileNameInBundle(bundlePath: "YourListImage.bundle")
     for imgName in listImageName 
         let image = fm.getImageInBundle(bundlePath: "YourListImage.bundle/\(imgName)")
     
    

【讨论】:

【参考方案3】:

请尝试以下方法:

    您必须将图像注册到“复制捆绑资源”。

    您必须在主包中添加过滤器模块。 enter image description here

它在我这边运行良好。也许您可以将过滤器从“jpg”格式更改为“png”格式。

我在 ios 10.x 之后的 Swift 3.0 和 xcode 8.1 版本上进行了测试。

【讨论】:

【参考方案4】:

我建议不要一次将所有图像加载到数组中。图片往往很大,很容易耗尽内存和崩溃。

除非您绝对必须一次将所有图像保存在内存中,否则最好保留一组路径或 URL,并根据需要一次加载一个图像。

假设装满图片的文件夹在您的应用程序包中,您可以使用 NSBundle 方法 URLsForResourcesWithExtension:subdirectory: 获取图片子目录中所有文件的 NSURLs 数组,可以是特定文件类型,也可以是 ALL文件(如果你为扩展传递 nil。)

一旦你有一个文件 url 数组,你可以将它映射到一个路径数组(如果需要),然后将 那个 映射到一个图像数组。

【讨论】:

嗨,邓肯,我肯定会加载路径。无论哪种方式都很好。 (一组小图像没有问题。)我似乎遇到的问题是如何将“文件夹放入应用程序包中” - 在 CopyBundleResources 中查看,它们似乎只是单个项目。请注意我答案底部的代码片段..似乎什么也没做?? 当你创建一个文件夹(不是组)时,就像你在截图中显示的那样,你应该选择文件夹,进入文件检查器,并确保为构建的目标检查“目标成员资格”你的应用程序。然后 Xcode 应该将图像文件夹复制到您的应用程序包中(作为文件夹。)我的回答中的 NSBundle 调用应该为您提供一个 NSURL 数组,然后您可以随心所欲地做任何事情。 (映射到路径数组,映射到图像数组,保存为 URL 并根据需要加载它们等) @Fattie 你解决过这个问题吗?我遇到了确切的问题。 @Fattie 在尝试此处列出的各种解决方案时,我遇到了与您相同的问题(逐字逐句),这很有趣。要么我们犯了一个没有人发现的错误,要么没有人创建图像子文件夹??? (令人震惊) @Fattie 我想我知道如何将您的图像文件夹放入 CopyBundleResources。从层次结构窗格中删除文件夹(您当前拥有“图像”文件夹),而是将图像文件夹直接从查找器或桌面拖到复制捆绑资源中。我能够以这种方式获取 CopyBundle Resources 中的文件夹。我找到了这个资源:nextriot.com/2015/08/27/…【参考方案5】:

斯威夫特 4

    if let path = Bundle.main.resourcePath 
        let imagePath = path + "/images"
        let url = NSURL(fileURLWithPath: imagePath)
        let fileManager = FileManager.default

        let properties = [URLResourceKey.localizedNameKey,
                          URLResourceKey.creationDateKey, 
                          URLResourceKey.localizedTypeDescriptionKey]

        do 
            let imageURLs = try fileManager.contentsOfDirectory(at: url as URL, includingPropertiesForKeys: properties, options:FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)

            print("image URLs: \(imageURLs)")
            // Create image from URL
            let firstImageURL = imageURLs[0]
            let firstImageData = try Data(contentsOf: firstImageURL)
            let firstImage = UIImage(data: firstImageData)

            // Do something with first image

         catch let error as NSError 
            print(error.description)
        
    

【讨论】:

以上是关于如何在 Swift 中从文件夹中获取 UIImage 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift3中从库的PHAsset中获取图像文件名

如何在 swift 5.3 中从 m4a 音频文件中获取 Track Id

在 Swift 中从 NSBundle 获取文件路径

如何在 Swift 5 中从数组中获取值

如何在 Swift 中从 Facebook 获取用户名

如何在 Swift 中从服务器下载 zip 文件?