1 // This may look like C code, but it is really -*- C++ -*- 2 // 3 // Copyright Bob Friesenhahn, 2001, 2002, 2003 4 // 5 // Resize image using specified resize algorithm with Magick++ API 6 // 7 // Usage: zoom [-density resolution] [-filter algorithm] [-geometry geometry] 8 // [-resample resolution] input_file output_file 9 // 10 11 #include <Magick++.h> 12 #include <iostream> 13 #include <string> 14 using namespace std; 15 using namespace Magick; 16 17 static void Usage ( char **argv ) 18 { 19 cout << "Usage: " << argv[0] 20 << " [-density resolution] [-filter algorithm] [-geometry geometry]" 21 << " [-resample resolution] input_file output_file" << endl 22 << " algorithm - bessel blackman box catrom cubic gaussian hamming hanning" << endl 23 << " hermite lanczos mitchell point quadratic sample scale sinc triangle" << endl; 24 exit(1); 25 } 26 27 static void ParseError (int position, char **argv) 28 { 29 cout << "Argument \"" << argv[position] << "\" at position" << position 30 << "incorrect" << endl; 31 Usage(argv); 32 } 33 34 int main(int argc,char **argv) 35 { 36 // Initialize ImageMagick install location for Windows 37 InitializeMagick(*argv); 38 39 if ( argc < 2 ) 40 Usage(argv); 41 42 enum ResizeAlgorithm 43 { 44 Zoom, 45 Scale, 46 Sample 47 }; 48 49 { 50 Geometry geometry; 51 Magick::FilterType filter(LanczosFilter); 52 Point density; 53 Point resample; 54 ResizeAlgorithm resize_algorithm=Zoom; 55 56 int argv_index=1; 57 while ((argv_index < argc - 2) && (*argv[argv_index] == '-')) 58 { 59 std::string command(argv[argv_index]); 60 if (command.compare("-density") == 0) 61 { 62 argv_index++; 63 try { 64 density=Geometry(argv[argv_index]); 65 } 66 catch( exception &/* error_ */) 67 { 68 ParseError(argv_index,argv); 69 } 70 argv_index++; 71 continue; 72 } 73 else if (command.compare("-filter") == 0) 74 { 75 argv_index++; 76 std::string algorithm(argv[argv_index]); 77 if (algorithm.compare("point") == 0) 78 filter=PointFilter; 79 else if (algorithm.compare("box") == 0) 80 filter=BoxFilter; 81 else if (algorithm.compare("triangle") == 0) 82 filter=TriangleFilter; 83 else if (algorithm.compare("hermite") == 0) 84 filter=HermiteFilter; 85 else if (algorithm.compare("hanning") == 0) 86 filter=HanningFilter; 87 else if (algorithm.compare("hamming") == 0) 88 filter=HammingFilter; 89 else if (algorithm.compare("blackman") == 0) 90 filter=BlackmanFilter; 91 else if (algorithm.compare("gaussian") == 0) 92 filter=GaussianFilter; 93 else if (algorithm.compare("quadratic") == 0) 94 filter=QuadraticFilter; 95 else if (algorithm.compare("cubic") == 0) 96 filter=CubicFilter; 97 else if (algorithm.compare("catrom") == 0) 98 filter=CatromFilter; 99 else if (algorithm.compare("mitchell") == 0) 100 filter=MitchellFilter; 101 else if (algorithm.compare("lanczos") == 0) 102 filter=LanczosFilter; 103 else if (algorithm.compare("bessel") == 0) 104 filter=BesselFilter; 105 else if (algorithm.compare("sinc") == 0) 106 filter=SincFilter; 107 else if (algorithm.compare("sample") == 0) 108 resize_algorithm=Sample; 109 else if (algorithm.compare("scale") == 0) 110 resize_algorithm=Scale; 111 else 112 ParseError(argv_index,argv); 113 argv_index++; 114 continue; 115 } 116 else if (command.compare("-geometry") == 0) 117 { 118 argv_index++; 119 try { 120 geometry=Geometry(argv[argv_index]); 121 } 122 catch( exception &/* error_ */) 123 { 124 ParseError(argv_index,argv); 125 } 126 argv_index++; 127 continue; 128 } 129 else if (command.compare("-resample") == 0) 130 { 131 argv_index++; 132 try { 133 resample=Geometry(argv[argv_index]); 134 } 135 catch( exception &/* error_ */) 136 { 137 ParseError(argv_index,argv); 138 } 139 argv_index++; 140 continue; 141 } 142 ParseError(argv_index,argv); 143 } 144 145 if (argv_index>argc-1) 146 ParseError(argv_index,argv); 147 std::string input_file(argv[argv_index]); 148 argv_index++; 149 if (argv_index>argc) 150 ParseError(argv_index,argv); 151 std::string output_file(argv[argv_index]); 152 153 try { 154 Image image(input_file); 155 if (density.isValid()) 156 image.density(density); 157 density=image.density(); 158 159 if (resample.isValid()) 160 { 161 geometry = 162 Geometry(static_cast<size_t> 163 (image.columns()*((double)resample.x()/density.x())+0.5), 164 static_cast<size_t> 165 (image.rows()*((double)resample.y()/density.y())+0.5)); 166 image.density(resample); 167 } 168 switch (resize_algorithm) 169 { 170 case Sample: 171 image.sample(geometry); 172 break; 173 case Scale: 174 image.scale(geometry); 175 break; 176 case Zoom: 177 image.filterType(filter); 178 image.zoom(geometry); 179 break; 180 } 181 image.write(output_file); 182 } 183 catch( exception &error_ ) 184 { 185 cout << "Caught exception: " << error_.what() << endl; 186 return 1; 187 } 188 } 189 190 return 0; 191 } 192