// 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; }