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