【问题标题】:How to give folder of images as input to Magick++ api?如何将图像文件夹作为 Magick++ api 的输入?
【发布时间】:2016-06-29 04:43:25
【问题描述】:

我需要将一个图像文件夹作为输入传递给 Magick++ api。可以在命令行中使用 mogrify 来完成,如帖子“ImageMagick script to resize folder of images”中所示。读取单个图像可以通过 api 调用来完成

图像图像(输入图像)

但是我们怎么能对一个图片文件夹做同样的事情呢?任何人都可以帮助我进行相应的 api 调用吗?

【问题讨论】:

    标签: c++ api image-processing magick++


    【解决方案1】:

    Magick++ API 中不包含该功能。您需要自己迭代目录,然后使用 Magick++ API 读取和写入图像。您可以在以下 Stack Overflow 帖子中找到有关如何在 C/C++ 中遍历文件夹的示例:How can I get the list of files in a directory using C or C++?

    【讨论】:

      【解决方案2】:

      我相信您将负责阅读该目录。 C 库dirent.h 是我首先想到的,但我确信有更好的 C++/系统/框架技术。

      #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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2020-12-25
        • 1970-01-01
        相关资源
        最近更新 更多