blob: 0b37af553bb85a47cbea073db6908628bd241c7a [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001// 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//
cristy3ed852e2009-09-05 21:47:34 +00007// 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
cristy3ed852e2009-09-05 21:47:34 +0000252 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)" );
cristyc48a5872014-01-06 11:12:04 +0000318 example.randomThresholdChannel( RedChannel, Geometry(4,4) );
cristy3ed852e2009-09-05 21:47:34 +0000319 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" );
cristy5c7087e2010-05-30 01:16:06 +0000436 example.randomThreshold( Geometry((size_t) (0.3*QuantumRange),
437 (size_t) (0.85*QuantumRange)) );
cristy3ed852e2009-09-05 21:47:34 +0000438 images.push_back( example );
439
440 cout << " unsharp mask ..." << endl;
441 example = model;
442 example.label( "Unsharp Mask" );
cristy3afd4012013-03-25 11:30:44 +0000443 // radius_, sigma_, amount_, threshold_
444 example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
cristy3ed852e2009-09-05 21:47:34 +0000445 images.push_back( example );
446
447 cout << " wave ..." << endl;
448 example = model;
449 example.label( "Wave" );
cristyc48a5872014-01-06 11:12:04 +0000450 example.alpha( true );
cristy3ed852e2009-09-05 21:47:34 +0000451 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
cristy4a16cd52010-01-05 14:04:01 +0000492 for_each( montage.begin(), montage.end(), depthImage(8) );
cristyc48a5872014-01-06 11:12:04 +0000493 for_each( montage.begin(), montage.end(), alphaImage( false ) );
cristy4a16cd52010-01-05 14:04:01 +0000494 for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );
495
cristy3ed852e2009-09-05 21:47:34 +0000496 cout << "Writing image \"demo_out.miff\" ..." << endl;
cristy508d9312010-02-10 21:10:30 +0000497 writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");
cristy3ed852e2009-09-05 21:47:34 +0000498
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}