如何使用ImageMagick按百分比绘制饼图?
例如:如果以百分比形式给出如45的值 - 如何使用Ruby或bash命令绘制仅有45%的饼图?
如果我使用ImageMagick的draw
运算符,需要如何设置弧值?或者我如何从整数值计算acr值?
E.G:
convert -size 100x100 xc:none -fill white -stroke black/
-draw "path 'M 30,40 A 1,1 0 0,0 70,20 .... ??
我试着阅读并理解这些例子,但弧线计算对我来说是一个谜。
答案 0 :(得分:7)
ImageMagick的draw
操作实现了this W3C document中定义的SVG“路径”。
不支持通过给出简单的'度'角度参数进行绘制。您需要使用三角函数计算每个路径的终点坐标和涉及弧的子路径。 (您必须使用绝对值或相对于当前点的相对值,具体取决于所使用的确切弧算子;另请参见下面的示例。)
在SVG(和ImageMagick)中,'path'表示对象的轮廓。还支持绘制复合路径:复合路径是具有子路径的路径,其中每个子路径由单个moveto
组成,后跟一个或多个line
或curve
操作。
对象的轮廓可以通过以下操作定义:
moveto :
设置新的当前点。
使用 M
表示绝对, m
表示相对移动。
lineto :
画一条直线。
使用 L
表示绝对值, l
表示相对移动。
curveto :
绘制贝塞尔曲线。
使用 C
, c
, S
和 s
绘制cubic Bezier curves。 (饼图不需要这些。)
使用 Q
, q
, T
和 t
绘制*quadratic Bezier curves。 (饼图不需要这些)。
arc :
绘制椭圆形或圆弧。
使用 A
和 a
来绘制elliptic arcs。对于 ellipse == circle 的特殊情况,我们需要这些饼图。
closepath :
通过在最后一次移动中画一条线来关闭当前形状。
使用 Z
或 z
;两者具有相同的效果:它们结束当前子路径并导致从当前点到当前子路径的初始点绘制自动直线。
这意味着,您可以使用此命令在黄色背景下使用黄色背景在280x280画布内绘制带有黑色边框的单个红色饼图楔:
convert \
-size 280x280 xc:yellow \
-stroke black \
-fill blue \
-draw "path 'M 120,140 L 120,40 A 100,100 0 0,1 137.36,41.52 Z'" \
red-pie-wedge.jpg
<强>结果:强>
M
)位于像素坐标(120/140)。 L
)从那里垂直向上绘制以协调(120/40)。 A
)进入坐标(137.36 / 41.52)。Z
),直线回到路径的起点。你总是需要做一些三角函数来计算绘制所有饼形楔所需的任何圆弧的端点。
以下是完整饼图的示例,其中包括上面的蓝色饼图:
convert \
-size 280x280 xc:yellow \
-stroke black \
-fill blue -draw "path 'M 120,140 L 120.00,40.00 A 100,100 0 0,1 137.36,41.52 Z'" \
-fill silver -draw "path 'M 120,140 L 137.36,41.52 A 100,100 0 0,1 154.20,46.00 Z'" \
-fill red -draw "path 'M 136,130 L 170.20,36.00 A 100,100 0 0,1 236.00,130.00 Z'" \
-fill green -draw "path 'M 120,140 L 220.00,140.00 A 100,100 0 1,1 120.00,40.00 Z'" \
-fill black -stroke none -pointsize 10 \
-draw "text 119,37 '10' text 142,41 '10' text 182,36 '70' text 226,156 '270'" \
piechart.jpg
<强>结果:强>