我需要將圖像的文件夾作爲輸入傳遞給Magick ++ api。它可以在命令行中使用mogrify完成,如「ImageMagick script to resize folder of images」後所示。讀取單個圖像可以通過API調用來完成作爲如何將圖像文件夾作爲輸入給Magick ++ api?
形象畫像(inputImage的)
但是,我們如何可以做同樣的圖像的文件夾?任何人都可以幫助我與各自的API調用?
我需要將圖像的文件夾作爲輸入傳遞給Magick ++ api。它可以在命令行中使用mogrify完成,如「ImageMagick script to resize folder of images」後所示。讀取單個圖像可以通過API調用來完成作爲如何將圖像文件夾作爲輸入給Magick ++ api?
形象畫像(inputImage的)
但是,我們如何可以做同樣的圖像的文件夾?任何人都可以幫助我與各自的API調用?
該功能不包含在Magick ++ API中。您需要自己迭代目錄,然後使用Magick ++ API讀取和寫入圖像。您可以在以下堆棧溢出文章中找到有關如何遍歷C/C++中的文件夾的示例:How can I get the list of files in a directory using C or C++?。
我相信你會負責的閱讀這個目錄。 C庫dirent.h
是我首先想到的,但我相信有更好的C++/system/framework技術。
#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;
}
MagickCore庫中還有ExpandFilenames(int *,char ***)
。
// 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
}