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 // Concept and algorithms lifted from PerlMagick demo script written
8 // by John Christy.
9 //
10 // Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris
11 //
12 
13 #include <Magick++.h>
14 #include <string>
15 #include <iostream>
16 #include <list>
17 
18 using namespace std;
19 
20 using namespace Magick;
21 
main(int,char ** argv)22 int main( int /*argc*/, char ** argv)
23 {
24 
25   // Initialize ImageMagick install location for Windows
26   InitializeMagick(*argv);
27 
28   try {
29 
30     string srcdir("");
31     if(getenv("SRCDIR") != 0)
32       srcdir = getenv("SRCDIR");
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       if (getenv("MAGICK_FONT") != 0)
86         example.font(string(getenv("MAGICK_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 << "  level red channel ..." << endl;
254       example = model;
255       example.label( "Level Channel\n(Red Channel)" );
256       example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
257       images.push_back( example );
258 
259       cout << "  median filter ..." << endl;
260       example = model;
261       example.label( "Median Filter" );
262       example.medianFilter( );
263       images.push_back( example );
264 
265       cout << "  modulate ..." << endl;
266       example = model;
267       example.label( "Modulate" );
268       example.modulate( 110, 110, 110 );
269       images.push_back( example );
270 
271       cout << "  monochrome ..." << endl;
272       example = model;
273       example.label( "Monochrome" );
274       example.quantizeColorSpace( GRAYColorspace );
275       example.quantizeColors( 2 );
276       example.quantizeDither( false );
277       example.quantize( );
278       images.push_back( example );
279 
280       cout << "  motion blur ..." << endl;
281       example = model;
282       example.label( "Motion Blur" );
283       example.motionBlur( 0.0, 7.0,45 );
284       images.push_back( example );
285 
286       cout << "  negate ..." << endl;
287       example = model;
288       example.label( "Negate" );
289       example.negate( );
290       images.push_back( example );
291 
292       cout << "  normalize ..." << endl;
293       example = model;
294       example.label( "Normalize" );
295       example.normalize( );
296       images.push_back( example );
297 
298       cout << "  oil paint ..." << endl;
299       example = model;
300       example.label( "Oil Paint" );
301       example.oilPaint( );
302       images.push_back( example );
303 
304       cout << "  ordered dither 2x2 ..." << endl;
305       example = model;
306       example.label( "Ordered Dither\n(2x2)" );
307       example.randomThreshold(2,2);
308       images.push_back( example );
309 
310       cout << "  ordered dither 3x3..." << endl;
311       example = model;
312       example.label( "Ordered Dither\n(3x3)" );
313       example.randomThreshold(3,3);
314       images.push_back( example );
315 
316       cout << "  ordered dither 4x4..." << endl;
317       example = model;
318       example.label( "Ordered Dither\n(4x4)" );
319       example.randomThreshold(4,4);
320       images.push_back( example );
321 
322       cout << "  ordered dither red 4x4..." << endl;
323       example = model;
324       example.label( "Ordered Dither\n(Red 4x4)" );
325       example.randomThresholdChannel(RedChannel,4,4);
326       images.push_back( example );
327 
328       cout << "  plasma ..." << endl;
329       Image plasma;
330       plasma.size( "130x194" );
331       plasma.read( "plasma:fractal" );
332       plasma.label( "Plasma" );
333       images.push_back( plasma );
334 
335       cout << "  quantize ..." << endl;
336       example = model;
337       example.label( "Quantize" );
338       example.quantize( );
339       images.push_back( example );
340 
341       cout << "  quantum operator ..." << endl;
342       example = model;
343       example.label( "Quantum Operator\nRed * 0.4" );
344       example.evaluate( RedChannel,MultiplyEvaluateOperator,0.40 );
345       images.push_back( example );
346 
347       cout << "  raise ..." << endl;
348       example = model;
349       example.label( "Raise" );
350       example.raise( );
351       images.push_back( example );
352 
353       cout << "  reduce noise ..." << endl;
354       example = model;
355       example.label( "Reduce Noise" );
356       example.reduceNoise( 1.0 );
357       images.push_back( example );
358 
359       cout << "  resize ..." << endl;
360       example = model;
361       example.label( "Resize" );
362       example.zoom( "50%" );
363       images.push_back( example );
364 
365       cout << "  roll ..." << endl;
366       example = model;
367       example.label( "Roll" );
368       example.roll( "+20+10" );
369       images.push_back( example );
370 
371       cout << "  rotate ..." << endl;
372       example = model;
373       example.label( "Rotate" );
374       example.rotate( 45 );
375       example.transparent( "black" );
376       images.push_back( example );
377 
378       cout << "  scale ..." << endl;
379       example = model;
380       example.label( "Scale" );
381       example.scale( "60%" );
382       images.push_back( example );
383 
384       cout << "  segment ..." << endl;
385       example = model;
386       example.label( "Segment" );
387       example.segment( 0.5, 0.25 );
388       images.push_back( example );
389 
390       cout << "  shade ..." << endl;
391       example = model;
392       example.label( "Shade" );
393       example.shade( 30, 30, false );
394       images.push_back( example );
395 
396       cout << "  sharpen ..." << endl;
397       example = model;
398       example.label("Sharpen");
399       example.sharpen( 0.0, 1.0 );
400       images.push_back( example );
401 
402       cout << "  shave ..." << endl;
403       example = model;
404       example.label("Shave");
405       example.shave( Geometry( 10, 10) );
406       images.push_back( example );
407 
408       cout << "  shear ..." << endl;
409       example = model;
410       example.label( "Shear" );
411       example.shear( 45, 45 );
412       example.transparent( "black" );
413       images.push_back( example );
414 
415       cout << "  spread ..." << endl;
416       example = model;
417       example.label( "Spread" );
418       example.spread( 3 );
419       images.push_back( example );
420 
421       cout << "  solarize ..." << endl;
422       example = model;
423       example.label( "Solarize" );
424       example.solarize( );
425       images.push_back( example );
426 
427       cout << "  swirl ..." << endl;
428       example = model;
429       example.backgroundColor( "#000000FF" );
430       example.label( "Swirl" );
431       example.swirl( 90 );
432       images.push_back( example );
433 
434       cout << "  threshold ..." << endl;
435       example = model;
436       example.label( "Threshold" );
437       example.threshold( QuantumRange/2.0 );
438       images.push_back( example );
439 
440       cout << "  threshold random ..." << endl;
441       example = model;
442       example.label( "Random\nThreshold" );
443       example.randomThreshold( (0.3*QuantumRange),
444         (0.85*QuantumRange) );
445       images.push_back( example );
446 
447       cout << "  unsharp mask ..." << endl;
448       example = model;
449       example.label( "Unsharp Mask" );
450       //           radius_, sigma_, amount_, threshold_
451       example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
452       images.push_back( example );
453 
454       cout << "  wave ..." << endl;
455       example = model;
456       example.label( "Wave" );
457       example.alpha( true );
458       example.backgroundColor( "#000000FF" );
459       example.wave( 25, 150 );
460       images.push_back( example );
461 
462       //
463       // Create image montage.
464       //
465       cout <<  "Montage images..." << endl;
466 
467       for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) );
468 
469       MontageFramed montageOpts;
470       montageOpts.geometry( "130x194+10+5>" );
471       montageOpts.gravity( CenterGravity );
472       montageOpts.borderColor( "green" );
473       montageOpts.borderWidth( 1 );
474       montageOpts.tile( "7x4" );
475       montageOpts.backgroundColor( "#ffffff" );
476       montageOpts.pointSize( 18 );
477       montageOpts.fillColor( "#600" );
478       montageOpts.strokeColor( Color() );
479       montageOpts.fileName( "Magick++ Demo" );
480       montageImages( &montage, images.begin(), images.end(), montageOpts );
481     }
482 
483     Image& montage_image = montage.front();
484     {
485       // Create logo image
486       cout << "Adding logo image ..." << endl;
487       Image logo( "logo:" );
488       logo.zoom( "45%" );
489 
490       // Composite logo into montage image
491       Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0);
492       montage_image.composite( logo, placement, OverCompositeOp );
493     }
494 
495     for_each( montage.begin(), montage.end(), depthImage(8) );
496     for_each( montage.begin(), montage.end(), alphaImage( false ) );
497     for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );
498 
499     cout << "Writing image \"demo_out.miff\" ..." << endl;
500     writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");
501 
502     // Uncomment following lines to display image to screen
503     //    cout <<  "Display image..." << endl;
504     //    montage_image.display();
505 
506   }
507   catch( exception &error_ )
508     {
509       cout << "Caught exception: " << error_.what() << endl;
510       return 1;
511     }
512 
513   return 0;
514 }
515