2016-06-27 9 views
1

Ich brauche einen Ordner mit Bildern als Eingabe für Magick ++ API. Dies kann unter Verwendung von mogrify in der Befehlszeile erfolgen, wie in dem Beitrag "ImageMagick script to resize folder of images" gezeigt. ein einzelne Bild Lesen kann durch api Ruf alsWie gebe ich einen Ordner mit Bildern als Eingabe für Magick ++ api ein?

Bild Bild (inputimage)

Aber wie könnten wir das gleiche tun für einen Ordner mit Bildern zu tun? Kann mir jemand mit dem jeweiligen API-Ruf helfen?

Antwort

1

Diese Funktion ist nicht in der Magick ++ API enthalten. Sie müssen das Verzeichnis selbst durchlaufen und dann die Magick ++ API verwenden, um das Bild zu lesen und zu schreiben. Ein Beispiel für die Iteration durch einen Ordner in C/C++ finden Sie im folgenden Stack Overflow-Post: How can I get the list of files in a directory using C or C++?.

1

Ich glaube, Sie wären verantwortlich für lesen das Verzeichnis. Die C-Bibliothek dirent.h ist das erste, was ich denke, aber ich bin sicher, es gibt bessere C++/System/Framework-Techniken.

#include <iostream> 
#include <vector> 
#include <dirent.h> 
#include <Magick++.h> 

int main(int argc, const char * argv[]) { 

    std::vector<Magick::Image> stack;   // Hold images found 
    DIR * dir_handler = opendir("/tmp/images"); // Open dir 
    struct dirent * dir_entry; 

    if (dir_handler != NULL) 
    { 
     // Iterate over entries in directory 
     while ((dir_entry = readdir(dir_handler)) != NULL) { 
      // Only act on regular files 
      if (dir_entry->d_type == DT_REG) { 
       // Concatenate path (could be better) 
       std::string filename("/tmp/images/"); 
       filename += dir_entry->d_name; 
       // Read image at path 
       stack.push_back(Magick::Image(filename)); 
      } 
     } 
     closedir(dir_handler); // House keeping 
    } else { 
     // Handle DIR error 
    } 

    // Append all images into single montage 
    Magick::Image output; 
    Magick::appendImages(&output, stack.begin(), stack.end()); 
    output.write("/tmp/all.png"); 

    return 0; 
} 

Es gibt auch ExpandFilenames(int *,char ***) in der MagickCore Bibliothek.

// Patterns to scan 
int pattern_count = 1; 
// First pattern 
char pattern[PATH_MAX] = "/tmp/images/*.png"; 
// Allocate memory for list of patterns 
char ** dir_pattern = (char **)MagickCore::AcquireMagickMemory(sizeof(char *)); 
// Assign first pattern 
dir_pattern[0] = pattern; 
// Expand patterns 
Magick::MagickBooleanType ok; 
ok = MagickCore::ExpandFilenames(&pattern_count, &dir_pattern); 

if (ok == Magick::MagickTrue) { 
    std::vector<Magick::Image> stack; 
    // `pattern_count' now holds results count 
    for (int i = 0; i < pattern_count; ++i) { 
     // `dir_pattern' has been re-allocated with found results 
     std::string filename(dir_pattern[i]); 
     stack.push_back(Magick::Image(filename)); 
    } 
    Magick::Image output; 
    Magick::appendImages(&output, stack.begin(), stack.end()); 
    output.write("/tmp/all.png"); 
} else { 
    // Error handle 
} 
Verwandte Themen