| // This may look like C code, but it is really -*- C++ -*- |
| // |
| // Copyright Bob Friesenhahn, 2001, 2002, 2003 |
| // |
| // Resize image using specified resize algorithm with Magick++ API |
| // |
| // Usage: zoom [-density resolution] [-filter algorithm] [-geometry geometry] |
| // [-resample resolution] input_file output_file |
| // |
| |
| #include <Magick++.h> |
| #include <iostream> |
| #include <string> |
| using namespace std; |
| using namespace Magick; |
| |
| static void Usage ( char **argv ) |
| { |
| cout << "Usage: " << argv[0] |
| << " [-density resolution] [-filter algorithm] [-geometry geometry]" |
| << " [-resample resolution] input_file output_file" << endl |
| << " algorithm - bessel blackman box catrom cubic gaussian hamming hanning" << endl |
| << " hermite lanczos mitchell point quadratic sample scale sinc triangle" << endl; |
| exit(1); |
| } |
| |
| static void ParseError (int position, char **argv) |
| { |
| cout << "Argument \"" << argv[position] << "\" at position" << position |
| << "incorrect" << endl; |
| Usage(argv); |
| } |
| |
| int main(int argc,char **argv) |
| { |
| // Initialize ImageMagick install location for Windows |
| InitializeMagick(*argv); |
| |
| if ( argc < 2 ) |
| Usage(argv); |
| |
| enum ResizeAlgorithm |
| { |
| Zoom, |
| Scale, |
| Sample |
| }; |
| |
| { |
| Geometry geometry; |
| Magick::FilterType filter(LanczosFilter); |
| Point density; |
| Point resample; |
| ResizeAlgorithm resize_algorithm=Zoom; |
| |
| int argv_index=1; |
| while ((argv_index < argc - 2) && (*argv[argv_index] == '-')) |
| { |
| std::string command(argv[argv_index]); |
| if (command.compare("-density") == 0) |
| { |
| argv_index++; |
| try { |
| density=Geometry(argv[argv_index]); |
| } |
| catch( exception &/* error_ */) |
| { |
| ParseError(argv_index,argv); |
| } |
| argv_index++; |
| continue; |
| } |
| else if (command.compare("-filter") == 0) |
| { |
| argv_index++; |
| std::string algorithm(argv[argv_index]); |
| if (algorithm.compare("point") == 0) |
| filter=PointFilter; |
| else if (algorithm.compare("box") == 0) |
| filter=BoxFilter; |
| else if (algorithm.compare("triangle") == 0) |
| filter=TriangleFilter; |
| else if (algorithm.compare("hermite") == 0) |
| filter=HermiteFilter; |
| else if (algorithm.compare("hanning") == 0) |
| filter=HanningFilter; |
| else if (algorithm.compare("hamming") == 0) |
| filter=HammingFilter; |
| else if (algorithm.compare("blackman") == 0) |
| filter=BlackmanFilter; |
| else if (algorithm.compare("gaussian") == 0) |
| filter=GaussianFilter; |
| else if (algorithm.compare("quadratic") == 0) |
| filter=QuadraticFilter; |
| else if (algorithm.compare("cubic") == 0) |
| filter=CubicFilter; |
| else if (algorithm.compare("catrom") == 0) |
| filter=CatromFilter; |
| else if (algorithm.compare("mitchell") == 0) |
| filter=MitchellFilter; |
| else if (algorithm.compare("lanczos") == 0) |
| filter=LanczosFilter; |
| else if (algorithm.compare("bessel") == 0) |
| filter=BesselFilter; |
| else if (algorithm.compare("sinc") == 0) |
| filter=SincFilter; |
| else if (algorithm.compare("sample") == 0) |
| resize_algorithm=Sample; |
| else if (algorithm.compare("scale") == 0) |
| resize_algorithm=Scale; |
| else |
| ParseError(argv_index,argv); |
| argv_index++; |
| continue; |
| } |
| else if (command.compare("-geometry") == 0) |
| { |
| argv_index++; |
| try { |
| geometry=Geometry(argv[argv_index]); |
| } |
| catch( exception &/* error_ */) |
| { |
| ParseError(argv_index,argv); |
| } |
| argv_index++; |
| continue; |
| } |
| else if (command.compare("-resample") == 0) |
| { |
| argv_index++; |
| try { |
| resample=Geometry(argv[argv_index]); |
| } |
| catch( exception &/* error_ */) |
| { |
| ParseError(argv_index,argv); |
| } |
| argv_index++; |
| continue; |
| } |
| ParseError(argv_index,argv); |
| } |
| |
| if (argv_index>argc-1) |
| ParseError(argv_index,argv); |
| std::string input_file(argv[argv_index]); |
| argv_index++; |
| if (argv_index>argc) |
| ParseError(argv_index,argv); |
| std::string output_file(argv[argv_index]); |
| |
| try { |
| Image image(input_file); |
| if (density.isValid()) |
| image.density(density); |
| density=image.density(); |
| |
| if (resample.isValid()) |
| { |
| geometry = |
| Geometry(static_cast<size_t> |
| (image.columns()*((double)resample.x()/density.x())+0.5), |
| static_cast<size_t> |
| (image.rows()*((double)resample.y()/density.y())+0.5)); |
| image.density(resample); |
| } |
| switch (resize_algorithm) |
| { |
| case Sample: |
| image.sample(geometry); |
| break; |
| case Scale: |
| image.scale(geometry); |
| break; |
| case Zoom: |
| image.filterType(filter); |
| image.zoom(geometry); |
| break; |
| } |
| image.write(output_file); |
| } |
| catch( exception &error_ ) |
| { |
| cout << "Caught exception: " << error_.what() << endl; |
| return 1; |
| } |
| } |
| |
| return 0; |
| } |