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

时间:2016-05-23 22:32:56

标签: ios swift uiimage

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

enter image description here

注意那里有一个名为" 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) }
    }

5 个答案:

答案 0 :(得分:6)

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

enter image description here

修改 这只是将图像复制到应用程序包中,如果您需要根据下面的代码将文件夹复制到应用程序包中,请使用关注StackOverflow question进行正确设置。

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

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

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

答案 1 :(得分:4)

乔。

请尝试以下方法:

我目前的情况如下。 enter image description here

  1. 您必须将图像注册到"复制捆绑资源"。

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

  3. 它也在我这边工作。 也许你可以改变" jpg"格式化为" png"之一。

    我已经在iOS 10.x之后,Swift 3.0和xcode 8.1版本上进行了测试。 如果您有任何问题,请与我联系。

答案 2 :(得分:3)

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

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

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

  3. 将文件夹添加到项目。

  4. 添加文件管理器扩展:

    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)
        }
    }
    
  5. 使用:

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

假设文件夹中包含大量图片,您可以使用NSBundle方法URLsForResourcesWithExtension:subdirectory:为图像子目录中的所有文件获取NSURL数组,或者使用特定文件filetype或ALL文件(如果你为扩展名传递nil。)

一旦你有一个文件网址数组,你可以根据需要将它映射到一个路径数组,然后将那个映射到一个图像数组。