]> granicus.if.org Git - imagemagick/blob - Magick++/demo/demo.cpp
(no commit message)
[imagemagick] / Magick++ / demo / demo.cpp
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
15 using namespace std;
16
17 using namespace Magick;
18
19 int 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( Geometry(4,4), RedChannel);
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_, gain_
444       example.unsharpmask( 0.0, 1.0, 1.0);
445       images.push_back( example );
446     
447       cout << "  wave ..." << endl;
448       example = model;
449       example.label( "Wave" );
450       example.matte( 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(), matteImage( 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 }