// Last updated 2011/03/14 18:23 // Implement Anthony's tilt-shift example from https://imagemagick.org.cn/Usage/photos/#tilt_shift // NOTE that I use the -function version - not the linear one // convert beijing_md.jpg -sigmoidal-contrast 15x30% \ // \( +clone -sparse-color Barycentric '0,0 black 0,%[fx:h-1] gray80' \ // -function polynomial 4,-4,1 \) \ // -compose Blur -set option:compose:args 15 -composite \ // beijing_model.jpg #include <windows.h> #include <wand/magick_wand.h> void test_wand(LPTSTR lpCmdLine) { MagickWand *mw = NULL; MagickWand *cw = NULL; // cloned wand // arguments for MagickSparseColorImage // Note that the colours are stored as separate *normalized* RGB components double arglist[10] = { 0,0, // RGB black 0,0,0, // The y coordinate is filled in later 0,-1, // RGB white 1,1,1 }; // arguments for MagickFunctionImage double funclist[3] = { 4,-4,1 }; MagickWandGenesis(); mw = NewMagickWand(); MagickReadImage(mw,"beijing_md.jpg"); // fill in the Y coordinate now that we can get the image dimensions arglist[6] = MagickGetImageHeight(mw)-1; MagickSigmoidalContrastImage(mw,MagickTrue,15,QuantumRange*30/100); cw = CloneMagickWand(mw); MagickSparseColorImage(cw,BlueChannel|GreenChannel|RedChannel,BarycentricColorInterpolate,10,arglist); // Do the polynomial function MagickFunctionImage(cw,PolynomialFunction,3,funclist); // -set option:compose:args 15 if (MagickSetImageArtifact(cw,"compose:args","15") == MagickFalse) { MessageBox(NULL,"Artifact failed","",MB_OK); mw = DestroyMagickWand(mw); cw = DestroyMagickWand(cw); MagickWandTerminus(); return; } MagickCompositeImage(mw,cw,BlurCompositeOp,0,0); MagickWriteImage(mw,"beijing_model.jpg"); mw = DestroyMagickWand(mw); cw = DestroyMagickWand(cw); MagickWandTerminus(); }