【问题标题】:How to know and load all images in a specific folder?如何知道并加载特定文件夹中的所有图像?
【发布时间】:2011-01-06 13:35:29
【问题描述】:

我有一个应用程序 (C++ Builder 6.0) 需要知道特定文件夹中的图像总数,然后我必须加载它们:在 ImageList 或 ComboBoxEx... 或任何其他控件中。 ..

我该怎么做?

我知道如何在控件中加载图像,或保存在 TList 或 ImageList 中...但是如何知道目录中有多少个文件文件,以及如何加载其中的每个图像??

对不起,我的英语不好。

【问题讨论】:

标签: c++ windows-xp c++builder


【解决方案1】:

我昨天使用 C++ 使用 boost::filesystem 库做了类似的事情。但是,如果您还没有使用 boost,我强烈建议您只使用 windows 库。这是我的代码,如果你有兴趣的话:

#include <algorithm>
#include <boost/filesystem.hpp>
#include <set>

namespace fs = boost::filesystem;

typedef std::vector<fs::path> PathVector;

std::auto_ptr<PathVector> ImagesInFolder(const fs::path& folderPath) {
    std::set<std::string> targetExtensions;
    targetExtensions.insert(".JPG");
    targetExtensions.insert(".BMP");
    targetExtensions.insert(".GIF");
    targetExtensions.insert(".PNG");

    std::auto_ptr<PathVector> paths(new PathVector());

    fs::directory_iterator end;
    for(fs::directory_iterator iter(folderPath); iter != end; ++iter) {
        if(!fs::is_regular_file(iter->status())) { continue; }

        std::string extension = iter->path().extension();
        std::transform(extension.begin(), extension.end(), extension.begin(), ::toupper);
        if(targetExtensions.find(extension) == targetExtensions.end()) { continue; }

        paths->push_back(iter->path());
    }

    return paths;
}

这并不能回答您关于如何将路径实际放入列表框的部分问题。

【讨论】:

  • 要编译它,我需​​要将其更改为 std::string extension = iter->path().extension().string();
【解决方案2】:

使用 Win32 函数 FindFirstFile 和 FindNextFile ...?

【讨论】:

    【解决方案3】:

    没有实用的方法来识别任意文件夹中的每个图像。几乎任何你不能识别为其他东西的东西,都可能是某种图像。再说一次,使用隐写术,即使是您可以识别为其他东西的东西也可能是(或包含)图像的至少一部分。

    实际上,您想挑选一组您想支持的格式,并编写了解它们的代码。对于很多用途,大约六种格式就足够了,尽管您选择的确切六种格式会因应用程序类型而异——例如,只有少数程序对位图和矢量图形都有任何用途。

    一旦你决定了你想要什么,DlgDirList 可能是列出一些文件的最简单的方法。如果这对您的目的不够灵活,那么下一个显而易见的选择是FindFirstFileFindNextFileFindClose

    【讨论】:

      【解决方案4】:

      要获取文件夹中所有文件的列表,请查看SysUtils 中的FindFirst 和 FindNext 函数。

      这是一个示例函数,它显示了如何获取文件列表。

      void __fastcall TForm1::GetDirList(TStrings *List, const AnsiString SearchStr)
      {
       TSearchRec SRec;
       AnsiString TempFName;
      
       List->Clear();
      
       // start search
       if (FindFirst(SearchStr, faAnyFile, SRec) == 0)
       {
         do
         { 
           if ((SRec.Attr & faDirectory) != faDirectory) // exclude directories
           {
             List->Add(SRec.Name);
           } // end if
         } 
         while (FindNext(SRec) == 0);
      
         FindClose(SRec);
       } // end if
      } 
      

      示例: // 获取目录下所有文件的列表 GetDirList(MyStringList, "C:\images*.*");

      // get list of all .bmp files in directory
      GetDirList(MyStringList, "C:\images\*.bmp");
      

      【讨论】:

        【解决方案5】:

        如果您可以升级到更新版本的 C++Builder,请查看TMS AdvSmoothImageListBox,来自TMS Software

        来自 Embarcadero 网站上的TMS Smooth Controls are available free for C++Builder 2010 用户。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-24
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 2015-07-25
        • 1970-01-01
        相关资源
        最近更新 更多