I have a problem that I would like to merge a large number of images using ImageMagick's convert.exe, but under Windows I have a 8192 byte long command line limit.
My solution to this is to split the task into smaller sub-task, run them, and do a final task which combines them together.
My idea is to write a function, which takes a vector of images and an integer, and splits the vector into n sub-vector all having "almost equal" parts.
So for example if I would like to split 11 into 3 groups it would be 4-4-3.
Can you tell me how can I do it in C++? I mean, to write a function
split_vec( const vector<image> &images, int split )
which does the splitting?
Also, can you tell me what is the most efficient way to do if I don't need to create new vectors, just iterate through the sub-parts? Like the std::substr
function with std::string
?
Note: I already use Boost in the project, so if there is some nice tool in Boost for this then it's perfect for me.
To get a base number for the size of each part, simply divide the total by the number of parts: 11/3 = 3. Obviously some of the parts will need to be bigger than that to get the proper total, but that's just the remainder: 11 % 3 = 2. So now you know that 2 of the parts will be size 3+1, and whatever's left over will be 3.
You can use
iterators
to iterate through the sub-parts of the problem. Iterators usage is similar to pointers to elements of thevector
What you want to on the images do could be implemented as a function
Here is my solution:
Have you thought about using the
xargs
program. This maybe a high-level solution to the problem.CreateProcess has a 32kb limit
Or, if you want to go via the shell,
You could create a template that returns a std::vector < std::vector > and receives the vector you want split, and the number of divisions. using for and iterator is very easy.