www/api/Magick++/demo_8cpp_source.html
| Magick++ 7.1.0 |
demo.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, 1999, 2000, 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 // Simple demo program for Magick++
9 //
10 // Concept and algorithms lifted from PerlMagick demo script written
11 // by John Christy.
12 //
13 // Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris
14 //
15
16 #include <Magick++.h>
17 #include <string>
18 #include <iostream>
19 #include <list>
20
21 using namespace std;
22
23 using namespace Magick;
24
25 #if MAGICKCORE_FREETYPE_DELEGATE
26 #define MakeLabel(image, text) image.label( (text) )
27 #else
28 #define MakeLabel(image, text)
29 #endif
30
31 int main( int /*argc*/, char ** argv)
32 {
33
34// Initialize ImageMagick install location for Windows
35InitializeMagick(*argv);
36
37const char *const p = getenv("MAGICK_FONT");
38const string MAGICK_FONT(p ? p : "");
39
40try {
41
42string srcdir("");
43if(getenv("SRCDIR") != 0)
44 srcdir = getenv("SRCDIR");
45
46 list<Image> montage;
47
48 {
49//
50// Read model & smile image.
51//
52 cout << "Read images ..." << endl;
53
54Image model( srcdir + "model.miff" );
55MakeLabel(model, "Magick++");
56 model.borderColor( "black" );
57 model.backgroundColor( "black" );
58
59Image smile( srcdir + "smile.miff" );
60MakeLabel(smile, "Smile");
61 smile.borderColor( "black" );
62
63//
64// Create image stack.
65//
66 cout << "Creating thumbnails..." << endl;
67
68// Construct initial list containing seven copies of a null image
69Image null;
70 null.size( Geometry(70,70) );
71 null.read( "NULL:black" );
72 list<Image> images( 7, null );
73
74Image example = model;
75
76// Each of the following follow the pattern
77// 1. obtain reference to (own copy of) image
78// 2. apply label to image
79// 3. apply operation to image
80// 4. append image to container
81
82 cout << " add noise ..." << endl;
83MakeLabel(example, "Add Noise");
84 example.addNoise( LaplacianNoise );
85 images.push_back( example );
86
87 cout << " add noise (blue) ..." << endl;
88MakeLabel(example, "Add Noise\n(Blue Channel)");
89 example.addNoiseChannel( BlueChannel, PoissonNoise );
90 images.push_back( example );
91
92 #if MAGICKCORE_FREETYPE_DELEGATE
93 cout << " annotate ..." << endl;
94 example = model;
95MakeLabel(example, "Annotate");
96 example.density( "72x72" );
97 example.fontPointsize( 18 );
98 example.font(MAGICK_FONT);
99 example.strokeColor( Color() );
100 example.fillColor( "gold" );
101 example.annotate( "Magick++", "+0+20", NorthGravity );
102 images.push_back( example );
103 #endif
104
105 cout << " blur ..." << endl;
106 example = model;
107MakeLabel(example, "Blur");
108 example.blur( 0, 1.5 );
109 images.push_back( example );
110
111 cout << " blur red channel ..." << endl;
112 example = model;
113MakeLabel(example, "Blur Channel\n(Red Channel)");
114 example.blurChannel( RedChannel, 0, 3.0 );
115 images.push_back( example );
116
117 cout << " border ..." << endl;
118 example = model;
119MakeLabel(example, "Border");
120 example.borderColor( "gold" );
121 example.border( Geometry(6,6) );
122 images.push_back( example );
123
124 cout << " channel ..." << endl;
125 example = model;
126MakeLabel(example, "Channel\n(Red Channel)");
127 example.channel( RedChannel );
128 images.push_back( example );
129
130 cout << " charcoal ..." << endl;
131 example = model;
132MakeLabel(example, "Charcoal");
133 example.charcoal( );
134 images.push_back( example );
135
136 cout << " composite ..." << endl;
137 example = model;
138MakeLabel(example, "Composite");
139 example.composite( smile, "+35+65", OverCompositeOp);
140 images.push_back( example );
141
142 cout << " contrast ..." << endl;
143 example = model;
144MakeLabel(example, "Contrast");
145 example.contrast( false );
146 images.push_back( example );
147
148 cout << " convolve ..." << endl;
149 example = model;
150MakeLabel(example, "Convolve");
151 {
152// 3x3 matrix
153const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 };
154 example.convolve( 3, kernel );
155 }
156 images.push_back( example );
157
158 cout << " crop ..." << endl;
159 example = model;
160MakeLabel(example, "Crop");
161 example.crop( "80x80+25+50" );
162 images.push_back( example );
163
164 cout << " despeckle ..." << endl;
165 example = model;
166MakeLabel(example, "Despeckle");
167 example.despeckle( );
168 images.push_back( example );
169
170 cout << " draw ..." << endl;
171 example = model;
172MakeLabel(example, "Draw");
173 example.fillColor(Color());
174 example.strokeColor( "gold" );
175 example.strokeWidth( 2 );
176 example.draw( DrawableCircle( 60,90, 60,120 ) );
177 images.push_back( example );
178
179 cout << " edge ..." << endl;
180 example = model;
181MakeLabel(example, "Detect Edges");
182 example.edge( );
183 images.push_back( example );
184
185 cout << " emboss ..." << endl;
186 example = model;
187MakeLabel(example, "Emboss");
188 example.emboss( );
189 images.push_back( example );
190
191 cout << " equalize ..." << endl;
192 example = model;
193MakeLabel(example, "Equalize");
194 example.equalize( );
195 images.push_back( example );
196
197 cout << " explode ..." << endl;
198 example = model;
199MakeLabel(example, "Explode");
200 example.backgroundColor( "#000000FF" );
201 example.implode( -1 );
202 images.push_back( example );
203
204 cout << " flip ..." << endl;
205 example = model;
206MakeLabel(example, "Flip");
207 example.flip( );
208 images.push_back( example );
209
210 cout << " flop ..." << endl;
211 example = model;
212MakeLabel(example, "Flop");
213 example.flop();
214 images.push_back( example );
215
216 cout << " frame ..." << endl;
217 example = model;
218MakeLabel(example, "Frame");
219 example.frame( );
220 images.push_back( example );
221
222 cout << " gamma ..." << endl;
223 example = model;
224MakeLabel(example, "Gamma");
225 example.gamma( 1.6 );
226 images.push_back( example );
227
228 cout << " gaussian blur ..." << endl;
229 example = model;
230MakeLabel(example, "Gaussian Blur");
231 example.gaussianBlur( 0.0, 1.5 );
232 images.push_back( example );
233
234 cout << " gaussian blur channel ..." << endl;
235 example = model;
236MakeLabel(example, "Gaussian Blur\n(Green Channel)");
237 example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 );
238 images.push_back( example );
239
240 cout << " gradient ..." << endl;
241Image gradient;
242 gradient.size( "130x194" );
243 gradient.read( "gradient:#20a0ff-#ffff00" );
244MakeLabel(gradient, "Gradient");
245 images.push_back( gradient );
246
247 cout << " grayscale ..." << endl;
248 example = model;
249MakeLabel(example, "Grayscale");
250 example.quantizeColorSpace( GRAYColorspace );
251 example.quantize( );
252 images.push_back( example );
253
254 cout << " implode ..." << endl;
255 example = model;
256MakeLabel(example, "Implode");
257 example.implode( 0.5 );
258 images.push_back( example );
259
260 cout << " level ..." << endl;
261 example = model;
262MakeLabel(example, "Level");
263 example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
264 images.push_back( example );
265
266 cout << " level red channel ..." << endl;
267 example = model;
268MakeLabel(example, "Level Channel\n(Red Channel)");
269 example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
270 images.push_back( example );
271
272 cout << " median filter ..." << endl;
273 example = model;
274MakeLabel(example, "Median Filter");
275 example.medianFilter( );
276 images.push_back( example );
277
278 cout << " modulate ..." << endl;
279 example = model;
280MakeLabel(example, "Modulate");
281 example.modulate( 110, 110, 110 );
282 images.push_back( example );
283
284 cout << " monochrome ..." << endl;
285 example = model;
286MakeLabel(example, "Monochrome");
287 example.quantizeColorSpace( GRAYColorspace );
288 example.quantizeColors( 2 );
289 example.quantizeDither( false );
290 example.quantize( );
291 images.push_back( example );
292
293 cout << " motion blur ..." << endl;
294 example = model;
295MakeLabel(example, "Motion Blur");
296 example.motionBlur( 0.0, 7.0,45 );
297 images.push_back( example );
298
299 cout << " negate ..." << endl;
300 example = model;
301MakeLabel(example, "Negate");
302 example.negate( );
303 images.push_back( example );
304
305 cout << " normalize ..." << endl;
306 example = model;
307MakeLabel(example, "Normalize");
308 example.normalize( );
309 images.push_back( example );
310
311 cout << " oil paint ..." << endl;
312 example = model;
313MakeLabel(example, "Oil Paint");
314 example.oilPaint( );
315 images.push_back( example );
316
317 cout << " ordered dither 2x2 ..." << endl;
318 example = model;
319MakeLabel(example, "Ordered Dither\n(2x2)");
320 example.randomThreshold(2,2);
321 images.push_back( example );
322
323 cout << " ordered dither 3x3..." << endl;
324 example = model;
325MakeLabel(example, "Ordered Dither\n(3x3)");
326 example.randomThreshold(3,3);
327 images.push_back( example );
328
329 cout << " ordered dither 4x4..." << endl;
330 example = model;
331MakeLabel(example, "Ordered Dither\n(4x4)");
332 example.randomThreshold(4,4);
333 images.push_back( example );
334
335 cout << " ordered dither red 4x4..." << endl;
336 example = model;
337MakeLabel(example, "Ordered Dither\n(Red 4x4)");
338 example.randomThresholdChannel(RedChannel,4,4);
339 images.push_back( example );
340
341 cout << " plasma ..." << endl;
342Image plasma;
343 plasma.size( "130x194" );
344 plasma.read( "plasma:fractal" );
345MakeLabel(plasma, "Plasma");
346 images.push_back( plasma );
347
348 cout << " quantize ..." << endl;
349 example = model;
350MakeLabel(example, "Quantize");
351 example.quantize( );
352 images.push_back( example );
353
354 cout << " quantum operator ..." << endl;
355 example = model;
356MakeLabel(example, "Quantum Operator\nRed * 0.4");
357 example.evaluate( RedChannel,MultiplyEvaluateOperator,0.40 );
358 images.push_back( example );
359
360 cout << " raise ..." << endl;
361 example = model;
362MakeLabel(example, "Raise");
363 example.raise( );
364 images.push_back( example );
365
366 cout << " reduce noise ..." << endl;
367 example = model;
368MakeLabel(example, "Reduce Noise");
369 example.reduceNoise( 1.0 );
370 images.push_back( example );
371
372 cout << " resize ..." << endl;
373 example = model;
374MakeLabel(example, "Resize");
375 example.zoom( "50%" );
376 images.push_back( example );
377
378 cout << " roll ..." << endl;
379 example = model;
380MakeLabel(example, "Roll");
381 example.roll( "+20+10" );
382 images.push_back( example );
383
384 cout << " rotate ..." << endl;
385 example = model;
386MakeLabel(example, "Rotate");
387 example.rotate( 45 );
388 example.transparent( "black" );
389 images.push_back( example );
390
391 cout << " scale ..." << endl;
392 example = model;
393MakeLabel(example, "Scale");
394 example.scale( "60%" );
395 images.push_back( example );
396
397 cout << " segment ..." << endl;
398 example = model;
399MakeLabel(example, "Segment");
400 example.segment( 0.5, 0.25 );
401 images.push_back( example );
402
403 cout << " shade ..." << endl;
404 example = model;
405MakeLabel(example, "Shade");
406 example.shade( 30, 30, false );
407 images.push_back( example );
408
409 cout << " sharpen ..." << endl;
410 example = model;
411MakeLabel(example, "Sharpen");
412 example.sharpen( 0.0, 1.0 );
413 images.push_back( example );
414
415 cout << " shave ..." << endl;
416 example = model;
417MakeLabel(example, "Shave");
418 example.shave( Geometry( 10, 10) );
419 images.push_back( example );
420
421 cout << " shear ..." << endl;
422 example = model;
423MakeLabel(example, "Shear");
424 example.shear( 45, 45 );
425 example.transparent( "black" );
426 images.push_back( example );
427
428 cout << " spread ..." << endl;
429 example = model;
430MakeLabel(example, "Spread");
431 example.spread( 3 );
432 images.push_back( example );
433
434 cout << " solarize ..." << endl;
435 example = model;
436MakeLabel(example, "Solarize");
437 example.solarize( );
438 images.push_back( example );
439
440 cout << " swirl ..." << endl;
441 example = model;
442 example.backgroundColor( "#000000FF" );
443MakeLabel(example, "Swirl");
444 example.swirl( 90 );
445 images.push_back( example );
446
447 cout << " threshold ..." << endl;
448 example = model;
449MakeLabel(example, "Threshold");
450 example.threshold( QuantumRange/2.0 );
451 images.push_back( example );
452
453 cout << " threshold random ..." << endl;
454 example = model;
455MakeLabel(example, "Random\nThreshold");
456 example.randomThreshold( (0.3*QuantumRange),
457 (0.85*QuantumRange) );
458 images.push_back( example );
459
460 cout << " unsharp mask ..." << endl;
461 example = model;
462MakeLabel(example, "Unsharp Mask");
463// radius_, sigma_, amount_, threshold_
464 example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
465 images.push_back( example );
466
467 cout << " wave ..." << endl;
468 example = model;
469MakeLabel(example, "Wave");
470 example.alpha( true );
471 example.backgroundColor( "#000000FF" );
472 example.wave( 25, 150 );
473 images.push_back( example );
474
475//
476// Create image montage.
477//
478 cout << "Montage images..." << endl;
479
480 for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) );
481
482MontageFramed montageOpts;
483 montageOpts.geometry( "130x194+10+5>" );
484 montageOpts.gravity( CenterGravity );
485 montageOpts.borderColor( "green" );
486 montageOpts.borderWidth( 1 );
487 montageOpts.tile( "7x4" );
488 montageOpts.backgroundColor( "#ffffff" );
489 montageOpts.pointSize( 18 );
490 montageOpts.font(MAGICK_FONT);
491 montageOpts.fillColor( "#600" );
492 montageOpts.strokeColor( Color() );
493 montageOpts.fileName( "Magick++ Demo" );
494montageImages( &montage, images.begin(), images.end(), montageOpts );
495 }
496
497Image& montage_image = montage.front();
498 {
499// Create logo image
500 cout << "Adding logo image ..." << endl;
501Image logo( "logo:" );
502 logo.zoom( "45%" );
503
504// Composite logo into montage image
505Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0);
506 montage_image.composite( logo, placement, OverCompositeOp );
507 }
508
509 for_each( montage.begin(), montage.end(), depthImage(8) );
510 for_each( montage.begin(), montage.end(), alphaImage( false ) );
511 for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );
512
513 cout << "Writing image "demo_out.miff" ..." << endl;
514writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");
515
516// Uncomment following lines to display image to screen
517// cout << "Display image..." << endl;
518// montage_image.display();
519
520 }
521catch( exception &error_ )
522 {
523 cout << "Caught exception: " << error_.what() << endl;
524return 1;
525 }
526
527return 0;
528 }
void gaussianBlur(const double radius_, const double sigma_)
Definition: Image.cpp:3253
void swirl(const double degrees_)
Definition: Image.cpp:4623
class MagickPPExport Color
Definition: Color.h:18
void modulate(const double brightness_, const double saturation_, const double hue_)
Definition: Image.cpp:3616
void annotate(const std::string &text_, const Geometry &location_)
Definition: Image.cpp:1858
void charcoal(const double radius_=0.0, const double sigma_=1.0)
Definition: Image.cpp:2200
void blur(const double radius_=0.0, const double sigma_=1.0)
Definition: Image.cpp:2107
void contrast(const bool sharpen_)
Definition: Image.cpp:2597
void medianFilter(const double radius_=0.0)
Definition: Image.cpp:3593
void composite(const Image &compositeImage_, const Geometry &offset_, const CompositeOperator compose_=InCompositeOp)
Definition: Image.cpp:2535
void unsharpmask(const double radius_, const double sigma_, const double amount_, const double threshold_)
Definition: Image.cpp:4811
void negate(const bool grayscale_=false)
Definition: Image.cpp:3745
#define MakeLabel(image, text)
Definition: demo.cpp:28
void raise(const Geometry &geometry_=raiseGeometryDefault, const bool raisedFlag_=false)
Definition: Image.cpp:4008
void crop(const Geometry &geometry_)
Definition: Image.cpp:2667
void density(const Point &density_)
Definition: Image.cpp:653
void shade(const double azimuth_=30, const double elevation_=30, const bool colorShading_=false)
Definition: Image.cpp:4399
STL namespace.
void equalize(void)
Definition: Image.cpp:2888
void zoom(const Geometry &geometry_)
Definition: Image.cpp:4997
void strokeWidth(const double strokeWidth_)
Definition: Image.cpp:1507
void blurChannel(const ChannelType channel_, const double radius_=0.0, const double sigma_=1.0)
Definition: Image.cpp:2118
void strokeColor(const Color &strokeColor_)
Definition: Image.cpp:1403
void oilPaint(const double radius_=0.0, const double sigma=1.0)
Definition: Image.cpp:3772
void spread(const double amount_=3.0)
Definition: Image.cpp:4555
Magick::Image::randomThresholdChannel
void randomThresholdChannel(const ChannelType channel_, const double low_, const double high_)
Definition: Image.cpp:4027
void motionBlur(const double radius_, const double sigma_, const double angle_)
Definition: Image.cpp:3733
void emboss(const double radius_=0.0, const double sigma_=1.0)
Definition: Image.cpp:2858
void segment(const double clusterThreshold_=1.0, const double smoothingThreshold_=1.5)
Definition: Image.cpp:4305
void reduceNoise(void)
Definition: Image.cpp:4138
void sharpen(const double radius_=0.0, const double sigma_=1.0)
Definition: Image.cpp:4425
void montageImages(Container *montageImages_, InputIterator first_, InputIterator last_, const Montage &options_)
Definition: STL.h:2484
void solarize(const double factor_=50.0)
Definition: Image.cpp:4502
void geometry(const Geometry &geometry_)
Definition: Montage.cpp:83
void quantize(const bool measureError_=false)
Definition: Image.cpp:3994
void read(const Blob &blob_)
Definition: Image.cpp:4038
void frame(const Geometry &geometry_=frameGeometryDefault)
Definition: Image.cpp:3162
void flip(void)
Definition: Image.cpp:2997
void shave(const Geometry &geometry_)
Definition: Image.cpp:4450
void borderColor(const Color &color_)
Definition: Image.cpp:429
void font(const std::string &font_)
Definition: Image.cpp:852
void fontPointsize(const double pointSize_)
Definition: Image.cpp:874
class MagickPPExport Geometry
Definition: Geometry.h:21
Definition: STL.h:1135
Definition: STL.h:1440
void writeImages(InputIterator first_, InputIterator last_, const std::string &imageSpec_, bool adjoin_=true)
Definition: STL.h:2823
void edge(const double radius_=0.0)
Definition: Image.cpp:2847
void fillColor(const Color &fillColor_)
Definition: Image.cpp:786
void scale(const Geometry &geometry_)
Definition: Image.cpp:4283
void size(const Geometry &geometry_)
Definition: Image.cpp:1379
void draw(const Drawable &drawable_)
Definition: Image.cpp:2798
Magick::Image::randomThreshold
void randomThreshold(const double low_, const double high_)
Definition: Image.cpp:4020
void evaluate(const ChannelType channel_, const MagickEvaluateOperator operator_, double rvalue_)
Definition: Image.cpp:2904
Definition: Geometry.h:37
void implode(const double factor_)
Definition: Image.cpp:3372
Magick::Image::addNoiseChannel
void addNoiseChannel(const ChannelType channel_, const NoiseType noiseType_, const double attenuate_=1.0)
Definition: Image.cpp:1807
Definition: Drawable.h:606
void wave(const double amplitude_=25.0, const double wavelength_=150.0)
Definition: Image.cpp:4852
double gamma(void) const
Definition: Image.cpp:947
void threshold(const double threshold_)
Definition: Image.cpp:4650
void convolve(const size_t order_, const double *kernel_)
Definition: Image.cpp:2625
void roll(const Geometry &roll_)
Definition: Image.cpp:4202
Magick::Image::gaussianBlurChannel
void gaussianBlurChannel(const ChannelType channel_, const double radius_, const double sigma_)
Definition: Image.cpp:3264
void transparent(const Color &color_, const bool inverse_=false)
Definition: Image.cpp:4713
Definition: STL.h:1416
void alpha(const bool alphaFlag_)
Definition: Image.cpp:307
void border(const Geometry &geometry_=borderGeometryDefault)
Definition: Image.cpp:2132
Definition: STL.h:805
void addNoise(const NoiseType noiseType_, const double attenuate_=1.0)
Definition: Image.cpp:1796
size_t columns(void) const
Definition: Image.cpp:590
void quantizeColors(const size_t colors_)
Definition: Image.cpp:1260
Definition: Montage.h:119
Definition: Blob.h:17
void flop(void)
Definition: Image.cpp:3120
void levelChannel(const ChannelType channel_, const double blackPoint_, const double whitePoint_, const double gamma_=1.0)
Definition: Image.cpp:3436
void despeckle(void)
Definition: Image.cpp:2767
void channel(const ChannelType channel_)
Definition: Image.cpp:2189
MagickPPExport void InitializeMagick(const char *path_)
Definition: Functions.cpp:45
void normalize(void)
Definition: Image.cpp:3764
int main(int, char **argv)
Definition: demo.cpp:31
Magick::Image::backgroundColor
void backgroundColor(const Color &color_)
Definition: Image.cpp:376
void quantizeDither(const bool ditherFlag_)
Definition: Image.cpp:1283
Definition: Image.h:55
void level(const double blackPoint_, const double whitePoint_, const double gamma_=1.0)
Definition: Image.cpp:3427
Magick::Image::quantizeColorSpace
void quantizeColorSpace(const ColorspaceType colorSpace_)
Definition: Image.cpp:1271
void shear(const double xShearAngle_, const double yShearAngle_)
Definition: Image.cpp:4464
void rotate(const double degrees_)
Definition: Image.cpp:4225