demo.cpp revision d9eec389c7cc5509499adbae12fd7a129914a732
1// This may look like C code, but it is really -*- C++ -*-
2//
3// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4//
5// Simple demo program for Magick++
6//
7// Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris
8//
9
10#include <cstring>
11#include <Magick++.h>
12#include <string>
13#include <iostream>
14#include <list>
15
16using namespace std;
17
18using namespace Magick;
19
20int main( int /*argc*/, char ** argv)
21{
22
23  // Initialize ImageMagick install location for Windows
24  InitializeMagick(*argv);
25
26  try {
27
28    string srcdir("");
29    if(getenv("SRCDIR") != 0)
30      srcdir = getenv("SRCDIR");
31
32    // Common font to use.
33    string font = "Helvetica";
34
35    list<Image> montage;
36
37    {
38      //
39      // Read model & smile image.
40      //
41      cout << "Read images ..." << endl;
42
43      Image model( srcdir + "model.miff" );
44      model.label( "Magick++" );
45      model.borderColor( "black" );
46      model.backgroundColor( "black" );
47
48      Image smile( srcdir + "smile.miff" );
49      smile.label( "Smile" );
50      smile.borderColor( "black" );
51
52      //
53      // Create image stack.
54      //
55      cout << "Creating thumbnails..." << endl;
56
57      // Construct initial list containing seven copies of a null image
58      Image null;
59      null.size( Geometry(70,70) );
60      null.read( "NULL:black" );
61      list<Image> images( 7, null );
62
63      Image example = model;
64
65      // Each of the following follow the pattern
66      //  1. obtain reference to (own copy of) image
67      //  2. apply label to image
68      //  3. apply operation to image
69      //  4. append image to container
70
71      cout << "  add noise ..." << endl;
72      example.label( "Add Noise" );
73      example.addNoise( LaplacianNoise );
74      images.push_back( example );
75
76      cout << "  add noise (blue) ..." << endl;
77      example.label( "Add Noise\n(Blue Channel)" );
78      example.addNoiseChannel( BlueChannel, PoissonNoise );
79      images.push_back( example );
80
81      cout << "  annotate ..." << endl;
82      example = model;
83      example.label( "Annotate" );
84      example.density( "72x72" );
85      example.fontPointsize( 18 );
86      example.font( font );
87      example.strokeColor( Color() );
88      example.fillColor( "gold" );
89      example.annotate( "Magick++", "+0+20", NorthGravity );
90      images.push_back( example );
91
92      cout << "  blur ..." << endl;
93      example = model;
94      example.label( "Blur" );
95      example.blur( 0, 1.5 );
96      images.push_back( example );
97
98      cout << "  blur red channel ..." << endl;
99      example = model;
100      example.label( "Blur Channel\n(Red Channel)" );
101      example.blurChannel( RedChannel, 0, 3.0 );
102      images.push_back( example );
103
104      cout << "  border ..." << endl;
105      example = model;
106      example.label( "Border" );
107      example.borderColor( "gold" );
108      example.border( Geometry(6,6) );
109      images.push_back( example );
110
111      cout << "  channel ..." << endl;
112      example = model;
113      example.label( "Channel\n(Red Channel)" );
114      example.channel( RedChannel );
115      images.push_back( example );
116
117      cout << "  charcoal ..." << endl;
118      example = model;
119      example.label( "Charcoal" );
120      example.charcoal( );
121      images.push_back( example );
122
123      cout << "  composite ..." << endl;
124      example = model;
125      example.label( "Composite" );
126      example.composite( smile, "+35+65", OverCompositeOp);
127      images.push_back( example );
128
129      cout << "  contrast ..." << endl;
130      example = model;
131      example.label( "Contrast" );
132      example.contrast( false );
133      images.push_back( example );
134
135      cout << "  convolve ..." << endl;
136      example = model;
137      example.label( "Convolve" );
138      {
139        // 3x3 matrix
140        const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 };
141        example.convolve( 3, kernel );
142      }
143      images.push_back( example );
144
145      cout << "  crop ..." << endl;
146      example = model;
147      example.label( "Crop" );
148      example.crop( "80x80+25+50" );
149      images.push_back( example );
150
151      cout << "  despeckle ..." << endl;
152      example = model;
153      example.label( "Despeckle" );
154      example.despeckle( );
155      images.push_back( example );
156
157      cout << "  draw ..." << endl;
158      example = model;
159      example.label( "Draw" );
160      example.fillColor(Color());
161      example.strokeColor( "gold" );
162      example.strokeWidth( 2 );
163      example.draw( DrawableCircle( 60,90, 60,120 ) );
164      images.push_back( example );
165
166      cout << "  edge ..." << endl;
167      example = model;
168      example.label( "Detect Edges" );
169      example.edge( );
170      images.push_back( example );
171
172      cout << "  emboss ..." << endl;
173      example = model;
174      example.label( "Emboss" );
175      example.emboss( );
176      images.push_back( example );
177
178      cout << "  equalize ..." << endl;
179      example = model;
180      example.label( "Equalize" );
181      example.equalize( );
182      images.push_back( example );
183
184      cout << "  explode ..." << endl;
185      example = model;
186      example.label( "Explode" );
187      example.backgroundColor( "#000000FF" );
188      example.implode( -1 );
189      images.push_back( example );
190
191      cout << "  flip ..." << endl;
192      example = model;
193      example.label( "Flip" );
194      example.flip( );
195      images.push_back( example );
196
197      cout << "  flop ..." << endl;
198      example = model;
199      example.label( "Flop" );
200      example.flop();
201      images.push_back( example );
202
203      cout << "  frame ..." << endl;
204      example = model;
205      example.label( "Frame" );
206      example.frame( );
207      images.push_back( example );
208
209      cout << "  gamma ..." << endl;
210      example = model;
211      example.label( "Gamma" );
212      example.gamma( 1.6 );
213      images.push_back( example );
214
215      cout << "  gaussian blur ..." << endl;
216      example = model;
217      example.label( "Gaussian Blur" );
218      example.gaussianBlur( 0.0, 1.5 );
219      images.push_back( example );
220
221      cout << "  gaussian blur channel ..." << endl;
222      example = model;
223      example.label( "Gaussian Blur\n(Green Channel)" );
224      example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 );
225      images.push_back( example );
226
227      cout << "  gradient ..." << endl;
228      Image gradient;
229      gradient.size( "130x194" );
230      gradient.read( "gradient:#20a0ff-#ffff00" );
231      gradient.label( "Gradient" );
232      images.push_back( gradient );
233
234      cout << "  grayscale ..." << endl;
235      example = model;
236      example.label( "Grayscale" );
237      example.quantizeColorSpace( GRAYColorspace );
238      example.quantize( );
239      images.push_back( example );
240
241      cout << "  implode ..." << endl;
242      example = model;
243      example.label( "Implode" );
244      example.implode( 0.5 );
245      images.push_back( example );
246
247      cout << "  level ..." << endl;
248      example = model;
249      example.label( "Level" );
250      example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
251      images.push_back( example );
252
253      cout << "  median filter ..." << endl;
254      example = model;
255      example.label( "Median Filter" );
256      example.medianFilter( );
257      images.push_back( example );
258
259      cout << "  modulate ..." << endl;
260      example = model;
261      example.label( "Modulate" );
262      example.modulate( 110, 110, 110 );
263      images.push_back( example );
264
265      cout << "  monochrome ..." << endl;
266      example = model;
267      example.label( "Monochrome" );
268      example.quantizeColorSpace( GRAYColorspace );
269      example.quantizeColors( 2 );
270      example.quantizeDither( false );
271      example.quantize( );
272      images.push_back( example );
273
274      cout << "  motion blur ..." << endl;
275      example = model;
276      example.label( "Motion Blur" );
277      example.motionBlur( 0.0, 7.0,45 );
278      images.push_back( example );
279
280      cout << "  negate ..." << endl;
281      example = model;
282      example.label( "Negate" );
283      example.negate( );
284      images.push_back( example );
285
286      cout << "  normalize ..." << endl;
287      example = model;
288      example.label( "Normalize" );
289      example.normalize( );
290      images.push_back( example );
291
292      cout << "  oil paint ..." << endl;
293      example = model;
294      example.label( "Oil Paint" );
295      example.oilPaint( );
296      images.push_back( example );
297
298      cout << "  ordered dither 2x2 ..." << endl;
299      example = model;
300      example.label( "Ordered Dither\n(2x2)" );
301      example.randomThreshold( Geometry(2,2) );
302      images.push_back( example );
303
304      cout << "  ordered dither 3x3..." << endl;
305      example = model;
306      example.label( "Ordered Dither\n(3x3)" );
307      example.randomThreshold( Geometry(3,3) );
308      images.push_back( example );
309
310      cout << "  ordered dither 4x4..." << endl;
311      example = model;
312      example.label( "Ordered Dither\n(4x4)" );
313      example.randomThreshold( Geometry(4,4) );
314      images.push_back( example );
315
316      cout << "  ordered dither red 4x4..." << endl;
317      example = model;
318      example.label( "Ordered Dither\n(Red 4x4)" );
319      example.randomThresholdChannel( Geometry(4,4), RedChannel);
320      images.push_back( example );
321
322      cout << "  plasma ..." << endl;
323      Image plasma;
324      plasma.size( "130x194" );
325      plasma.read( "plasma:fractal" );
326      plasma.label( "Plasma" );
327      images.push_back( plasma );
328
329      cout << "  quantize ..." << endl;
330      example = model;
331      example.label( "Quantize" );
332      example.quantize( );
333      images.push_back( example );
334
335      cout << "  quantum operator ..." << endl;
336      example = model;
337      example.label( "Quantum Operator\nRed * 0.4" );
338      example.quantumOperator( RedChannel,MultiplyEvaluateOperator,0.40 );
339      images.push_back( example );
340
341      cout << "  raise ..." << endl;
342      example = model;
343      example.label( "Raise" );
344      example.raise( );
345      images.push_back( example );
346
347      cout << "  reduce noise ..." << endl;
348      example = model;
349      example.label( "Reduce Noise" );
350      example.reduceNoise( 1.0 );
351      images.push_back( example );
352
353      cout << "  resize ..." << endl;
354      example = model;
355      example.label( "Resize" );
356      example.zoom( "50%" );
357      images.push_back( example );
358
359      cout << "  roll ..." << endl;
360      example = model;
361      example.label( "Roll" );
362      example.roll( "+20+10" );
363      images.push_back( example );
364
365      cout << "  rotate ..." << endl;
366      example = model;
367      example.label( "Rotate" );
368      example.rotate( 45 );
369      example.transparent( "black" );
370      images.push_back( example );
371
372      cout << "  scale ..." << endl;
373      example = model;
374      example.label( "Scale" );
375      example.scale( "60%" );
376      images.push_back( example );
377
378      cout << "  segment ..." << endl;
379      example = model;
380      example.label( "Segment" );
381      example.segment( 0.5, 0.25 );
382      images.push_back( example );
383
384      cout << "  shade ..." << endl;
385      example = model;
386      example.label( "Shade" );
387      example.shade( 30, 30, false );
388      images.push_back( example );
389
390      cout << "  sharpen ..." << endl;
391      example = model;
392      example.label("Sharpen");
393      example.sharpen( 0.0, 1.0 );
394      images.push_back( example );
395
396      cout << "  shave ..." << endl;
397      example = model;
398      example.label("Shave");
399      example.shave( Geometry( 10, 10) );
400      images.push_back( example );
401
402      cout << "  shear ..." << endl;
403      example = model;
404      example.label( "Shear" );
405      example.shear( 45, 45 );
406      example.transparent( "black" );
407      images.push_back( example );
408
409      cout << "  spread ..." << endl;
410      example = model;
411      example.label( "Spread" );
412      example.spread( 3 );
413      images.push_back( example );
414
415      cout << "  solarize ..." << endl;
416      example = model;
417      example.label( "Solarize" );
418      example.solarize( );
419      images.push_back( example );
420
421      cout << "  swirl ..." << endl;
422      example = model;
423      example.backgroundColor( "#000000FF" );
424      example.label( "Swirl" );
425      example.swirl( 90 );
426      images.push_back( example );
427
428      cout << "  threshold ..." << endl;
429      example = model;
430      example.label( "Threshold" );
431      example.threshold( QuantumRange/2.0 );
432      images.push_back( example );
433
434      cout << "  threshold random ..." << endl;
435      example = model;
436      example.label( "Random\nThreshold" );
437      example.randomThreshold( Geometry((size_t) (0.3*QuantumRange),
438        (size_t) (0.85*QuantumRange)) );
439      images.push_back( example );
440
441      cout << "  unsharp mask ..." << endl;
442      example = model;
443      example.label( "Unsharp Mask" );
444      //           radius_, sigma_, amount_, threshold_
445      example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
446      images.push_back( example );
447
448      cout << "  wave ..." << endl;
449      example = model;
450      example.label( "Wave" );
451      example.matte( true );
452      example.backgroundColor( "#000000FF" );
453      example.wave( 25, 150 );
454      images.push_back( example );
455
456      //
457      // Create image montage.
458      //
459      cout <<  "Montage images..." << endl;
460
461      for_each( images.begin(), images.end(), fontImage( font ) );
462      for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) );
463
464      MontageFramed montageOpts;
465      montageOpts.geometry( "130x194+10+5>" );
466      montageOpts.gravity( CenterGravity );
467      montageOpts.borderColor( "green" );
468      montageOpts.borderWidth( 1 );
469      montageOpts.tile( "7x4" );
470      montageOpts.compose( OverCompositeOp );
471      montageOpts.backgroundColor( "#ffffff" );
472      montageOpts.font( font );
473      montageOpts.pointSize( 18 );
474      montageOpts.fillColor( "#600" );
475      montageOpts.strokeColor( Color() );
476      montageOpts.compose(OverCompositeOp);
477      montageOpts.fileName( "Magick++ Demo" );
478      montageImages( &montage, images.begin(), images.end(), montageOpts );
479    }
480
481    Image& montage_image = montage.front();
482    {
483      // Create logo image
484      cout << "Adding logo image ..." << endl;
485      Image logo( "logo:" );
486      logo.zoom( "45%" );
487
488      // Composite logo into montage image
489      Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0);
490      montage_image.composite( logo, placement, OverCompositeOp );
491    }
492
493    for_each( montage.begin(), montage.end(), depthImage(8) );
494    for_each( montage.begin(), montage.end(), matteImage( false ) );
495    for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );
496
497    cout << "Writing image \"demo_out.miff\" ..." << endl;
498    writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");
499
500    // Uncomment following lines to display image to screen
501    //    cout <<  "Display image..." << endl;
502    //    montage_image.display();
503
504  }
505  catch( exception &error_ )
506    {
507      cout << "Caught exception: " << error_.what() << endl;
508      return 1;
509    }
510
511  return 0;
512}
513