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