// Last updated 2008/11/25 18:23 // There's no equivalent convert command for this. It is a demo of MagickWand. // Bits of this were pinched from // https://imagemagick.org.cn/api/MagickWand/drawtest_8c-source.html #include <windows.h> #include <wand/magick_wand.h> void test_wand(void) { MagickWand *m_wand = NULL; DrawingWand *d_wand = NULL; PixelWand *c_wand = NULL; unsigned long radius,diameter; diameter = 640; radius = diameter/2; MagickWandGenesis(); m_wand = NewMagickWand(); d_wand = NewDrawingWand(); c_wand = NewPixelWand(); PixelSetColor(c_wand,"white"); MagickNewImage(m_wand,diameter,diameter,c_wand); DrawSetStrokeOpacity(d_wand,1); // circle and rectangle PushDrawingWand(d_wand); // Hmmmm. Very weird. rgb(0,0,1) draws a black line around the edge // of the circle as it should. But rgb(0,0,0) or black don't. // AND if I remove the PixelSetColor then it draws a white boundary // around the rectangle (and presumably around the circle too) PixelSetColor(c_wand,"rgb(0,0,1)"); DrawSetStrokeColor(d_wand,c_wand); DrawSetStrokeWidth(d_wand,4); DrawSetStrokeAntialias(d_wand,1); PixelSetColor(c_wand,"red"); //DrawSetStrokeOpacity(d_wand,1); DrawSetFillColor(d_wand,c_wand); DrawCircle(d_wand,radius,radius,radius,radius*2); DrawRectangle(d_wand,50,13,120,87); PopDrawingWand(d_wand); // rounded rectangle PushDrawingWand(d_wand); { const PointInfo points[37] = { { 378.1,81.72 }, { 381.1,79.56 }, { 384.3,78.12 }, { 387.6,77.33 }, { 391.1,77.11 }, { 394.6,77.62 }, { 397.8,78.77 }, { 400.9,80.57 }, { 403.6,83.02 }, { 523.9,216.8 }, { 526.2,219.7 }, { 527.6,223 }, { 528.4,226.4 }, { 528.6,229.8 }, { 528,233.3 }, { 526.9,236.5 }, { 525.1,239.5 }, { 522.6,242.2 }, { 495.9,266.3 }, { 493,268.5 }, { 489.7,269.9 }, { 486.4,270.8 }, { 482.9,270.9 }, { 479.5,270.4 }, { 476.2,269.3 }, { 473.2,267.5 }, { 470.4,265 }, { 350,131.2 }, { 347.8,128.3 }, { 346.4,125.1 }, { 345.6,121.7 }, {345.4,118.2 }, { 346,114.8 }, { 347.1,111.5 }, { 348.9,108.5 }, { 351.4,105.8 }, { 378.1,81.72 } }; DrawSetStrokeAntialias(d_wand,MagickTrue); DrawSetStrokeWidth(d_wand,2.016); DrawSetStrokeLineCap(d_wand,RoundCap); DrawSetStrokeLineJoin(d_wand,RoundJoin); (void) DrawSetStrokeDashArray(d_wand,0,(const double *)NULL); (void) PixelSetColor(c_wand,/*"#000080"*/"rgb(0,0,128)"); /* If strokecolor is removed completely then the circle is not there */ DrawSetStrokeColor(d_wand,c_wand); /* But now I've added strokeopacity - 1=circle there 0=circle not there */ /* If opacity is 1 the black edge around the rectangle is visible */ DrawSetStrokeOpacity(d_wand,1); /* No effect */ // DrawSetFillRule(d_wand,EvenOddRule); /* this doesn't affect the circle */ (void) PixelSetColor(c_wand,"#c2c280"/*"rgb(194,194,128)"*/); DrawSetFillColor(d_wand,c_wand); //1=circle there 0=circle there but rectangle fill disappears // DrawSetFillOpacity(d_wand,0); DrawPolygon(d_wand,37,points); // DrawSetStrokeOpacity(d_wand,1); } PopDrawingWand(d_wand); /* yellow polygon */ PushDrawingWand(d_wand); { const PointInfo points[15] = { { 540,288 }, { 561.6,216 }, { 547.2,43.2 }, { 280.8,36 }, { 302.4,194.4 }, { 331.2,64.8 }, { 504,64.8 }, { 475.2,115.2 }, { 525.6,93.6 }, { 496.8,158.4 }, { 532.8,136.8 }, { 518.4,180 }, { 540,172.8 }, { 540,223.2 }, { 540,288 } }; DrawSetStrokeAntialias(d_wand,MagickTrue); DrawSetStrokeWidth(d_wand,5.976); DrawSetStrokeLineCap(d_wand,RoundCap); DrawSetStrokeLineJoin(d_wand,RoundJoin); (void) DrawSetStrokeDashArray(d_wand,0,(const double *)NULL); (void) PixelSetColor(c_wand,"#4000c2"); DrawSetStrokeColor(d_wand,c_wand); DrawSetFillRule(d_wand,EvenOddRule); (void) PixelSetColor(c_wand,"#ffff00"); DrawSetFillColor(d_wand,c_wand); DrawPolygon(d_wand,15,points); } PopDrawingWand(d_wand); // rotated and translated ellipse // The DrawEllipse function only draws the ellipse with // the major and minor axes orthogonally aligned. This also // applies to some of the other functions such as DrawRectangle. // If you want an ellipse that has the major axis rotated, you // have to rotate the coordinate system before the ellipse is // drawn. And you'll also want the ellipse somewhere on the // image rather than at the top left (where the 0,0 origin is // located) so before drawing the ellipse we move the origin to // wherever we want the centre of the ellipse to be and then // rotate the coordinate system by the angle of rotation we wish // to apply to the ellipse and *then* we draw the ellipse. // NOTE that doing all this within PushDrawingWand()/PopDrawingWand() // means that the coordinate system will be restored after // the PopDrawingWand PushDrawingWand(d_wand); PixelSetColor(c_wand,"rgb(0,0,1)"); DrawSetStrokeColor(d_wand,c_wand); DrawSetStrokeWidth(d_wand,2); DrawSetStrokeAntialias(d_wand,1); PixelSetColor(c_wand,"orange"); //DrawSetStrokeOpacity(d_wand,1); DrawSetFillColor(d_wand,c_wand); // Be careful of the order in which you meddle with the // coordinate system! Rotating and then translating is // not the same as translating then rotating DrawTranslate(d_wand,radius/2,3*radius/2); DrawRotate(d_wand,-30); DrawEllipse(d_wand,0,0,radius/8,3*radius/8,0,360); PopDrawingWand(d_wand); // A line from the centre of the circle // to the top left edge of the image DrawLine(d_wand,0,0,radius,radius); MagickDrawImage(m_wand,d_wand); MagickWriteImage(m_wand,"chart_test.jpg"); c_wand = DestroyPixelWand(c_wand); m_wand = DestroyMagickWand(m_wand); d_wand = DestroyDrawingWand(d_wand); MagickWandTerminus(); }