如何在 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:
获取图片子目录中所有文件的 NSURL
s 数组,可以是特定文件类型,也可以是 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章