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