Magick++  7.0.7
Convert, Edit, Or Compose Bitmap Images
zoom.cpp
Go to the documentation of this file.
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 }
void density(const Point &density_)
Definition: Image.cpp:652
bool isValid() const
Definition: Geometry.cpp:696
STL namespace.
void write(Blob *blob_)
Definition: Image.cpp:4867
void zoom(const Geometry &geometry_)
Definition: Image.cpp:4968
void filterType(const FilterType filterType_)
Definition: Image.cpp:840
static void ParseError(int position, char **argv)
Definition: zoom.cpp:27
class MagickPPExport Geometry
Definition: Geometry.h:19
void scale(const Geometry &geometry_)
Definition: Image.cpp:4254
double x(void) const
Definition: Geometry.cpp:701
void sample(const Geometry &geometry_)
Definition: Image.cpp:4232
size_t rows(void) const
Definition: Image.cpp:1351
size_t columns(void) const
Definition: Image.cpp:589
static void Usage(char **argv)
Definition: zoom.cpp:17
double y(void) const
Definition: Geometry.cpp:706
int main(int argc, char **argv)
Definition: zoom.cpp:34
Definition: Blob.h:15
MagickPPExport void InitializeMagick(const char *path_)
Definition: Functions.cpp:43