demo.cpp revision c48a587b7476fdb7dc307dfa9305debd1025e52a
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 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 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( RedChannel, Geometry(4,4) ); 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_, amount_, threshold_ 444 example.unsharpmask( 0.0, 1.0, 1.0, 0.05); 445 images.push_back( example ); 446 447 cout << " wave ..." << endl; 448 example = model; 449 example.label( "Wave" ); 450 example.alpha( 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(), alphaImage( 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} 512