520 lines
15 KiB
C++
520 lines
15 KiB
C++
// This may look like C code, but it is really -*- C++ -*-
|
|
//
|
|
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
|
|
//
|
|
// Simple demo program for Magick++
|
|
//
|
|
// Concept and algorithms lifted from PerlMagick demo script written
|
|
// by John Christy.
|
|
//
|
|
// Max run-time size 60MB (as compared with 95MB for PerlMagick) under SPARC Solaris
|
|
//
|
|
|
|
#include <Magick++.h>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <list>
|
|
|
|
using namespace std;
|
|
|
|
using namespace Magick;
|
|
|
|
int main( int /*argc*/, char ** argv)
|
|
{
|
|
|
|
// Initialize ImageMagick install location for Windows
|
|
InitializeMagick(*argv);
|
|
|
|
try {
|
|
|
|
string srcdir("");
|
|
if(getenv("SRCDIR") != 0)
|
|
srcdir = getenv("SRCDIR");
|
|
|
|
// Common font to use.
|
|
string font = "Helvetica";
|
|
|
|
list<Image> montage;
|
|
|
|
{
|
|
//
|
|
// Read model & smile image.
|
|
//
|
|
cout << "Read images ..." << endl;
|
|
|
|
Image model( srcdir + "model.miff" );
|
|
model.label( "Magick++" );
|
|
model.borderColor( "black" );
|
|
model.backgroundColor( "black" );
|
|
|
|
Image smile( srcdir + "smile.miff" );
|
|
smile.label( "Smile" );
|
|
smile.borderColor( "black" );
|
|
|
|
//
|
|
// Create image stack.
|
|
//
|
|
cout << "Creating thumbnails..." << endl;
|
|
|
|
// Construct initial list containing seven copies of a null image
|
|
Image null;
|
|
null.size( Geometry(70,70) );
|
|
null.read( "NULL:black" );
|
|
list<Image> images( 7, null );
|
|
|
|
Image example = model;
|
|
|
|
// Each of the following follow the pattern
|
|
// 1. obtain reference to (own copy of) image
|
|
// 2. apply label to image
|
|
// 3. apply operation to image
|
|
// 4. append image to container
|
|
|
|
cout << " add noise ..." << endl;
|
|
example.label( "Add Noise" );
|
|
example.addNoise( LaplacianNoise );
|
|
images.push_back( example );
|
|
|
|
cout << " add noise (blue) ..." << endl;
|
|
example.label( "Add Noise\n(Blue Channel)" );
|
|
example.addNoiseChannel( BlueChannel, PoissonNoise );
|
|
images.push_back( example );
|
|
|
|
cout << " annotate ..." << endl;
|
|
example = model;
|
|
example.label( "Annotate" );
|
|
example.density( "72x72" );
|
|
example.fontPointsize( 18 );
|
|
example.font( font );
|
|
example.strokeColor( Color() );
|
|
example.fillColor( "gold" );
|
|
example.annotate( "Magick++", "+0+20", NorthGravity );
|
|
images.push_back( example );
|
|
|
|
cout << " blur ..." << endl;
|
|
example = model;
|
|
example.label( "Blur" );
|
|
example.blur( 0, 1.5 );
|
|
images.push_back( example );
|
|
|
|
cout << " blur red channel ..." << endl;
|
|
example = model;
|
|
example.label( "Blur Channel\n(Red Channel)" );
|
|
example.blurChannel( RedChannel, 0, 3.0 );
|
|
images.push_back( example );
|
|
|
|
cout << " border ..." << endl;
|
|
example = model;
|
|
example.label( "Border" );
|
|
example.borderColor( "gold" );
|
|
example.border( Geometry(6,6) );
|
|
images.push_back( example );
|
|
|
|
cout << " channel ..." << endl;
|
|
example = model;
|
|
example.label( "Channel\n(Red Channel)" );
|
|
example.channel( RedChannel );
|
|
images.push_back( example );
|
|
|
|
cout << " charcoal ..." << endl;
|
|
example = model;
|
|
example.label( "Charcoal" );
|
|
example.charcoal( );
|
|
images.push_back( example );
|
|
|
|
cout << " composite ..." << endl;
|
|
example = model;
|
|
example.label( "Composite" );
|
|
example.composite( smile, "+35+65", OverCompositeOp);
|
|
images.push_back( example );
|
|
|
|
cout << " contrast ..." << endl;
|
|
example = model;
|
|
example.label( "Contrast" );
|
|
example.contrast( false );
|
|
images.push_back( example );
|
|
|
|
cout << " convolve ..." << endl;
|
|
example = model;
|
|
example.label( "Convolve" );
|
|
{
|
|
// 3x3 matrix
|
|
const double kernel[] = { 1, 1, 1, 1, 4, 1, 1, 1, 1 };
|
|
example.convolve( 3, kernel );
|
|
}
|
|
images.push_back( example );
|
|
|
|
cout << " crop ..." << endl;
|
|
example = model;
|
|
example.label( "Crop" );
|
|
example.crop( "80x80+25+50" );
|
|
images.push_back( example );
|
|
|
|
cout << " despeckle ..." << endl;
|
|
example = model;
|
|
example.label( "Despeckle" );
|
|
example.despeckle( );
|
|
images.push_back( example );
|
|
|
|
cout << " draw ..." << endl;
|
|
example = model;
|
|
example.label( "Draw" );
|
|
example.fillColor(Color());
|
|
example.strokeColor( "gold" );
|
|
example.strokeWidth( 2 );
|
|
example.draw( DrawableCircle( 60,90, 60,120 ) );
|
|
images.push_back( example );
|
|
|
|
cout << " edge ..." << endl;
|
|
example = model;
|
|
example.label( "Detect Edges" );
|
|
example.edge( );
|
|
images.push_back( example );
|
|
|
|
cout << " emboss ..." << endl;
|
|
example = model;
|
|
example.label( "Emboss" );
|
|
example.emboss( );
|
|
images.push_back( example );
|
|
|
|
cout << " equalize ..." << endl;
|
|
example = model;
|
|
example.label( "Equalize" );
|
|
example.equalize( );
|
|
images.push_back( example );
|
|
|
|
cout << " explode ..." << endl;
|
|
example = model;
|
|
example.label( "Explode" );
|
|
example.backgroundColor( "#000000FF" );
|
|
example.implode( -1 );
|
|
images.push_back( example );
|
|
|
|
cout << " flip ..." << endl;
|
|
example = model;
|
|
example.label( "Flip" );
|
|
example.flip( );
|
|
images.push_back( example );
|
|
|
|
cout << " flop ..." << endl;
|
|
example = model;
|
|
example.label( "Flop" );
|
|
example.flop();
|
|
images.push_back( example );
|
|
|
|
cout << " frame ..." << endl;
|
|
example = model;
|
|
example.label( "Frame" );
|
|
example.frame( );
|
|
images.push_back( example );
|
|
|
|
cout << " gamma ..." << endl;
|
|
example = model;
|
|
example.label( "Gamma" );
|
|
example.gamma( 1.6 );
|
|
images.push_back( example );
|
|
|
|
cout << " gaussian blur ..." << endl;
|
|
example = model;
|
|
example.label( "Gaussian Blur" );
|
|
example.gaussianBlur( 0.0, 1.5 );
|
|
images.push_back( example );
|
|
|
|
cout << " gaussian blur channel ..." << endl;
|
|
example = model;
|
|
example.label( "Gaussian Blur\n(Green Channel)" );
|
|
example.gaussianBlurChannel( GreenChannel, 0.0, 1.5 );
|
|
images.push_back( example );
|
|
|
|
cout << " gradient ..." << endl;
|
|
Image gradient;
|
|
gradient.size( "130x194" );
|
|
gradient.read( "gradient:#20a0ff-#ffff00" );
|
|
gradient.label( "Gradient" );
|
|
images.push_back( gradient );
|
|
|
|
cout << " grayscale ..." << endl;
|
|
example = model;
|
|
example.label( "Grayscale" );
|
|
example.quantizeColorSpace( GRAYColorspace );
|
|
example.quantize( );
|
|
images.push_back( example );
|
|
|
|
cout << " implode ..." << endl;
|
|
example = model;
|
|
example.label( "Implode" );
|
|
example.implode( 0.5 );
|
|
images.push_back( example );
|
|
|
|
cout << " level ..." << endl;
|
|
example = model;
|
|
example.label( "Level" );
|
|
example.level( 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
|
|
images.push_back( example );
|
|
|
|
cout << " level red channel ..." << endl;
|
|
example = model;
|
|
example.label( "Level Channel\n(Red Channel)" );
|
|
example.levelChannel( RedChannel, 0.20*QuantumRange, 0.90*QuantumRange, 1.20 );
|
|
images.push_back( example );
|
|
|
|
cout << " median filter ..." << endl;
|
|
example = model;
|
|
example.label( "Median Filter" );
|
|
example.medianFilter( );
|
|
images.push_back( example );
|
|
|
|
cout << " modulate ..." << endl;
|
|
example = model;
|
|
example.label( "Modulate" );
|
|
example.modulate( 110, 110, 110 );
|
|
images.push_back( example );
|
|
|
|
cout << " monochrome ..." << endl;
|
|
example = model;
|
|
example.label( "Monochrome" );
|
|
example.quantizeColorSpace( GRAYColorspace );
|
|
example.quantizeColors( 2 );
|
|
example.quantizeDither( false );
|
|
example.quantize( );
|
|
images.push_back( example );
|
|
|
|
cout << " motion blur ..." << endl;
|
|
example = model;
|
|
example.label( "Motion Blur" );
|
|
example.motionBlur( 0.0, 7.0,45 );
|
|
images.push_back( example );
|
|
|
|
cout << " negate ..." << endl;
|
|
example = model;
|
|
example.label( "Negate" );
|
|
example.negate( );
|
|
images.push_back( example );
|
|
|
|
cout << " normalize ..." << endl;
|
|
example = model;
|
|
example.label( "Normalize" );
|
|
example.normalize( );
|
|
images.push_back( example );
|
|
|
|
cout << " oil paint ..." << endl;
|
|
example = model;
|
|
example.label( "Oil Paint" );
|
|
example.oilPaint( );
|
|
images.push_back( example );
|
|
|
|
cout << " ordered dither 2x2 ..." << endl;
|
|
example = model;
|
|
example.label( "Ordered Dither\n(2x2)" );
|
|
example.randomThreshold( Geometry(2,2) );
|
|
images.push_back( example );
|
|
|
|
cout << " ordered dither 3x3..." << endl;
|
|
example = model;
|
|
example.label( "Ordered Dither\n(3x3)" );
|
|
example.randomThreshold( Geometry(3,3) );
|
|
images.push_back( example );
|
|
|
|
cout << " ordered dither 4x4..." << endl;
|
|
example = model;
|
|
example.label( "Ordered Dither\n(4x4)" );
|
|
example.randomThreshold( Geometry(4,4) );
|
|
images.push_back( example );
|
|
|
|
cout << " ordered dither red 4x4..." << endl;
|
|
example = model;
|
|
example.label( "Ordered Dither\n(Red 4x4)" );
|
|
example.randomThresholdChannel( Geometry(4,4), RedChannel);
|
|
images.push_back( example );
|
|
|
|
cout << " plasma ..." << endl;
|
|
Image plasma;
|
|
plasma.size( "130x194" );
|
|
plasma.read( "plasma:fractal" );
|
|
plasma.label( "Plasma" );
|
|
images.push_back( plasma );
|
|
|
|
cout << " quantize ..." << endl;
|
|
example = model;
|
|
example.label( "Quantize" );
|
|
example.quantize( );
|
|
images.push_back( example );
|
|
|
|
cout << " quantum operator ..." << endl;
|
|
example = model;
|
|
example.label( "Quantum Operator\nRed * 0.4" );
|
|
example.quantumOperator( RedChannel,MultiplyEvaluateOperator,0.40 );
|
|
images.push_back( example );
|
|
|
|
cout << " raise ..." << endl;
|
|
example = model;
|
|
example.label( "Raise" );
|
|
example.raise( );
|
|
images.push_back( example );
|
|
|
|
cout << " reduce noise ..." << endl;
|
|
example = model;
|
|
example.label( "Reduce Noise" );
|
|
example.reduceNoise( 1.0 );
|
|
images.push_back( example );
|
|
|
|
cout << " resize ..." << endl;
|
|
example = model;
|
|
example.label( "Resize" );
|
|
example.zoom( "50%" );
|
|
images.push_back( example );
|
|
|
|
cout << " roll ..." << endl;
|
|
example = model;
|
|
example.label( "Roll" );
|
|
example.roll( "+20+10" );
|
|
images.push_back( example );
|
|
|
|
cout << " rotate ..." << endl;
|
|
example = model;
|
|
example.label( "Rotate" );
|
|
example.rotate( 45 );
|
|
example.transparent( "black" );
|
|
images.push_back( example );
|
|
|
|
cout << " scale ..." << endl;
|
|
example = model;
|
|
example.label( "Scale" );
|
|
example.scale( "60%" );
|
|
images.push_back( example );
|
|
|
|
cout << " segment ..." << endl;
|
|
example = model;
|
|
example.label( "Segment" );
|
|
example.segment( 0.5, 0.25 );
|
|
images.push_back( example );
|
|
|
|
cout << " shade ..." << endl;
|
|
example = model;
|
|
example.label( "Shade" );
|
|
example.shade( 30, 30, false );
|
|
images.push_back( example );
|
|
|
|
cout << " sharpen ..." << endl;
|
|
example = model;
|
|
example.label("Sharpen");
|
|
example.sharpen( 0.0, 1.0 );
|
|
images.push_back( example );
|
|
|
|
cout << " shave ..." << endl;
|
|
example = model;
|
|
example.label("Shave");
|
|
example.shave( Geometry( 10, 10) );
|
|
images.push_back( example );
|
|
|
|
cout << " shear ..." << endl;
|
|
example = model;
|
|
example.label( "Shear" );
|
|
example.shear( 45, 45 );
|
|
example.transparent( "black" );
|
|
images.push_back( example );
|
|
|
|
cout << " spread ..." << endl;
|
|
example = model;
|
|
example.label( "Spread" );
|
|
example.spread( 3 );
|
|
images.push_back( example );
|
|
|
|
cout << " solarize ..." << endl;
|
|
example = model;
|
|
example.label( "Solarize" );
|
|
example.solarize( );
|
|
images.push_back( example );
|
|
|
|
cout << " swirl ..." << endl;
|
|
example = model;
|
|
example.backgroundColor( "#000000FF" );
|
|
example.label( "Swirl" );
|
|
example.swirl( 90 );
|
|
images.push_back( example );
|
|
|
|
cout << " threshold ..." << endl;
|
|
example = model;
|
|
example.label( "Threshold" );
|
|
example.threshold( QuantumRange/2.0 );
|
|
images.push_back( example );
|
|
|
|
cout << " threshold random ..." << endl;
|
|
example = model;
|
|
example.label( "Random\nThreshold" );
|
|
example.randomThreshold( Geometry((size_t) (0.3*QuantumRange),
|
|
(size_t) (0.85*QuantumRange)) );
|
|
images.push_back( example );
|
|
|
|
cout << " unsharp mask ..." << endl;
|
|
example = model;
|
|
example.label( "Unsharp Mask" );
|
|
// radius_, sigma_, amount_, threshold_
|
|
example.unsharpmask( 0.0, 1.0, 1.0, 0.05);
|
|
images.push_back( example );
|
|
|
|
cout << " wave ..." << endl;
|
|
example = model;
|
|
example.label( "Wave" );
|
|
example.matte( true );
|
|
example.backgroundColor( "#000000FF" );
|
|
example.wave( 25, 150 );
|
|
images.push_back( example );
|
|
|
|
//
|
|
// Create image montage.
|
|
//
|
|
cout << "Montage images..." << endl;
|
|
|
|
for_each( images.begin(), images.end(), fontImage( font ) );
|
|
for_each( images.begin(), images.end(), strokeColorImage( Color("#600") ) );
|
|
|
|
MontageFramed montageOpts;
|
|
montageOpts.geometry( "130x194+10+5>" );
|
|
montageOpts.gravity( CenterGravity );
|
|
montageOpts.borderColor( "green" );
|
|
montageOpts.borderWidth( 1 );
|
|
montageOpts.tile( "7x4" );
|
|
montageOpts.compose( OverCompositeOp );
|
|
montageOpts.backgroundColor( "#ffffff" );
|
|
montageOpts.font( font );
|
|
montageOpts.pointSize( 18 );
|
|
montageOpts.fillColor( "#600" );
|
|
montageOpts.strokeColor( Color() );
|
|
montageOpts.compose(OverCompositeOp);
|
|
montageOpts.fileName( "Magick++ Demo" );
|
|
montageImages( &montage, images.begin(), images.end(), montageOpts );
|
|
}
|
|
|
|
Image& montage_image = montage.front();
|
|
{
|
|
// Create logo image
|
|
cout << "Adding logo image ..." << endl;
|
|
Image logo( "logo:" );
|
|
logo.zoom( "45%" );
|
|
|
|
// Composite logo into montage image
|
|
Geometry placement(0,0,(montage_image.columns()/2)-(logo.columns()/2),0);
|
|
montage_image.composite( logo, placement, OverCompositeOp );
|
|
}
|
|
|
|
for_each( montage.begin(), montage.end(), depthImage(8) );
|
|
for_each( montage.begin(), montage.end(), matteImage( false ) );
|
|
for_each( montage.begin(), montage.end(), compressTypeImage( RLECompression) );
|
|
|
|
cout << "Writing image \"demo_out.miff\" ..." << endl;
|
|
writeImages(montage.begin(),montage.end(),"demo_out_%d.miff");
|
|
|
|
// Uncomment following lines to display image to screen
|
|
// cout << "Display image..." << endl;
|
|
// montage_image.display();
|
|
|
|
}
|
|
catch( exception &error_ )
|
|
{
|
|
cout << "Caught exception: " << error_.what() << endl;
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|