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