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