Как узнать и загрузить все изображения в определенную папку? - PullRequest
4 голосов
/ 19 января 2010

У меня есть приложение (C ++ Builder 6.0), которое должно знать общее количество изображений в определенной папке, а затем я должен загрузить их: в ImageList или в ComboBoxEx ... или в любом другом элементе управления...

Как я могу это сделать?

Я знаю, как загрузить изображение в элемент управления, или сохранить в TList, или в ImageList ... но Как узнать, как это сделать?Сколько файлов есть в каталоге, и как загрузить каждое изображение в нем ??

Мне очень жаль моего английского.

Ответы [ 5 ]

1 голос
/ 19 января 2010

Вчера я сделал нечто подобное с 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;
}

Это не ответит на часть вашего вопроса о том, как на самом деле поместить пути в список.

1 голос
/ 19 января 2010

Используйте функции Win32 FindFirstFile и FindNextFile ...?

0 голосов
/ 20 января 2010

Если вы можете перейти на более новую версию C ++ Builder, взгляните на TMS AdvSmoothImageListBox , из TMS Software .

TMS AdvSmoothImageListBox

Плавные элементы управления TMS доступны бесплатно для пользователей C ++ Builder 2010 на веб-сайте Embarcadero.

0 голосов
/ 20 января 2010

Чтобы получить список всех файлов в папке, посмотрите на FindFirst и FindNext в SysUtils .

Вот пример функции, которая показывает, как получить список файлов.

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");
0 голосов
/ 19 января 2010

Нет практического способа идентифицировать каждое изображение в произвольной папке.Почти все, что вы не можете идентифицировать как что-то еще, может быть каким-то образом.Опять же, используя стеганографию, даже то, что вы можете идентифицировать как что-то еще, может быть (или содержать) хотя бы часть изображения.

Реально, вы хотите выбратьнабор форматов, которые вы хотите поддерживать, и написать код, который знает о них.Для многих целей вполне достаточно полдюжины форматов или около того, хотя точная полдюжина, которую вы выбираете, будет зависеть от типа приложения - только несколько программ могут использовать как растровую, так и векторную графику, например.

Как только вы определились, что вы хотите, DlgDirList, вероятно, самый простой способ перечислить некоторые файлы.Если это не достаточно гибко для ваших целей, следующий очевидный выбор - FindFirstFile, FindNextFile и FindClose.

...