使用 Python 自訂簡報中的圖形
簡介
考慮一個正方形。在 PowerPoint 中,使用 編輯點,您可以:
- 將正方形的角向內或向外移動,
- 調整角或點的曲率,
- 向正方形添加新點,
- 操作其點。
您可以將這些操作套用到任何形狀。使用 編輯點,您可以修改形狀或從現有形狀建立新形狀。
形狀編輯提示

在使用 編輯點 編輯 PowerPoint 形狀之前,請先留意以下關於形狀的說明:
- 形狀(或其路徑)可以是 封閉 的或 開放 的。
- 封閉形狀沒有起點或終點;開放形狀有起點與終點。
- 每個形狀至少有兩個由線段連接的錨點。
- 線段可以是直線或曲線;錨點決定線段的性質。
- 錨點可以是 角點、平滑 或 直線:
- 角點 是兩條直線段以角度相交的點。
- 平滑 點有兩個共線的控制手柄,且相鄰的線段形成平滑的曲線。此時,兩個手柄距離錨點相等。
- 直線 點同樣有兩個共線的控制手柄,且相鄰的線段形成平滑的曲線。但此時,手柄距離錨點不必相等。
- 透過移動或編輯錨點(從而改變線段角度),您可以改變形狀的外觀。
要編輯 PowerPoint 形狀,Aspose.Slides 提供了 GeometryPath 類別。
- 一個 GeometryPath 實例代表 GeometryShape 物件的幾何路徑。
- 若要從 GeometryShape 實例取得 GeometryPath,請使用 GeometryShape.get_geometry_paths 方法。
- 若要為形狀設定 GeometryPath,請對 實心形狀 使用 GeometryShape.set_geometry_path,對 組合形狀 使用 GeometryShape.set_geometry_paths。
- 若要新增線段,請使用 GeometryPath 上的方法。
- 使用 GeometryPath.stroke 與 GeometryPath.fill_mode 屬性來控制幾何路徑的外觀。
- 使用 GeometryPath.path_data 屬性可取得形狀的幾何路徑,作為路徑線段陣列。
簡單編輯操作
以下方法用於簡單的編輯操作。
在路徑末端新增直線:
line_to(point)
line_to(x, y)
在路徑的指定位置新增直線:
line_to(point, index)
line_to(x, y, index)
在路徑末端新增立方貝塞爾曲線:
cubic_bezier_to(point1, point2, point3)
cubic_bezier_to(x1, y1, x2, y2, x3, y3)
在路徑的指定位置新增立方貝塞爾曲線:
cubic_bezier_to(point1, point2, point3, index)
cubic_bezier_to(x1, y1, x2, y2, x3, y3, index)
在路徑末端新增二次貝塞爾曲線:
quadratic_bezier_to(point1, point2)
quadratic_bezier_to(x1, y1, x2, y2)
在路徑的指定位置新增二次貝塞爾曲線:
quadratic_bezier_to(point1, point2, index)
quadratic_bezier_to(x1, y1, x2, y2, index)
在路徑中附加弧線:
arc_to(width, heigth, startAngle, sweepAngle)
關閉路徑中的目前圖形:
close_figure()
設定下一個點的位置:
move_to(point)
move_to(x, y)
移除指定索引的路徑線段:
remove_at(index)
向形狀新增自訂點
本節說明如何透過新增自訂點序列來定義自由形式的形狀。藉由指定有序點與線段類型(直線或曲線)並可選擇性關閉路徑,您可以直接在投影片上繪製精確的自訂圖形—多邊形、圖示、標註或標誌。
- 建立 GeometryShape 類別的實例,並設定其 ShapeType.RECTANGLE。
- 從形狀取得 GeometryPath 實例。
- 在路徑的兩個上方點之間插入新點。
- 在路徑的兩個下方點之間插入新點。
- 將更新後的路徑套用至形狀。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 200, 100)
geometry_path = shape.get_geometry_paths()[0]
geometry_path.line_to(100, 50, 1)
geometry_path.line_to(100, 50, 4)
shape.set_geometry_path(geometry_path)
presentation.save("custom_points.pptx", slides.export.SaveFormat.PPTX)

從形狀移除點
有時自訂形狀包含不必要的點,會使幾何結構變得複雜或影響渲染效果。本節說明如何從形狀的路徑中移除特定點,以簡化輪廓並取得更乾淨、精確的結果。
- 建立 GeometryShape 類別的實例,並設定其 ShapeType.HEART 類型。
- 從形狀取得 GeometryPath 實例。
- 從路徑中移除一個線段。
- 將更新後的路徑套用至形狀。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.HEART, 100, 100, 300, 300)
path = shape.get_geometry_paths()[0]
path.remove_at(2)
shape.set_geometry_path(path)
presentation.save("removed_points.pptx", slides.export.SaveFormat.PPTX)

建立自訂形狀
透過定義 GeometryPath 並以直線、弧線與貝塞爾曲線組合,可建立專屬的向量形狀。本節示範如何從頭開始建構自訂幾何,並將產生的形狀加入投影片。
- 計算形狀的點。
- 建立 GeometryPath 類別的實例。
- 將點填入路徑。
- 建立 GeometryShape 類別的實例。
- 將路徑套用至形狀。
import aspose.slides as slides
import aspose.pydrawing as draw
import math
points = []
R = 100
r = 50
step = 72
for angle in range(-90, 270, step):
radians = angle * (math.pi / 180)
x = R * math.cos(radians)
y = R * math.sin(radians)
points.append(draw.PointF(x + R, y + R))
radians = math.pi * (angle + step / 2) / 180.0
x = r * math.cos(radians)
y = r * math.sin(radians)
points.append(draw.PointF(x + R, y + R))
star_path = slides.GeometryPath()
star_path.move_to(points[0])
for i in range(len(points)):
star_path.line_to(points[i])
star_path.close_figure()
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, R * 2, R * 2)
shape.set_geometry_path(star_path)
presentation.save("custom_shape.pptx", slides.export.SaveFormat.PPTX)

建立組合自訂形狀
建立組合自訂形狀可將多個幾何路徑合併為投影片上的單一可重用形狀。定義並合併這些路徑,即可打造超越標準形狀集的複雜視覺效果。
- 建立 GeometryShape 類別的實例。
- 建立第一個 GeometryPath 類別的實例。
- 建立第二個 GeometryPath 類別的實例。
- 將兩條路徑同時套用至形狀。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 200, 100)
geometry_path_0 = slides.GeometryPath()
geometry_path_0.move_to(0, 0)
geometry_path_0.line_to(shape.width, 0)
geometry_path_0.line_to(shape.width, shape.height/3)
geometry_path_0.line_to(0, shape.height / 3)
geometry_path_0.close_figure()
geometry_path_1 = slides.GeometryPath()
geometry_path_1.move_to(0, shape.height/3 * 2)
geometry_path_1.line_to(shape.width, shape.height / 3 * 2)
geometry_path_1.line_to(shape.width, shape.height)
geometry_path_1.line_to(0, shape.height)
geometry_path_1.close_figure()
shape.set_geometry_paths([ geometry_path_0, geometry_path_1])
presentation.save("composite_shape.pptx", slides.export.SaveFormat.PPTX)

建立帶有曲線角的自訂形狀
本節說明如何使用幾何路徑繪製帶有平滑曲線角的自訂形狀。您將結合直線段與圓弧以形成輪廓,並將完成的形狀加入投影片。
import aspose.slides as slides
import aspose.pydrawing as draw
shape_x = 20
shape_y = 20
shape_width = 300
shape_height = 200
left_top_size = 50
right_top_size = 20
right_bottom_size = 40
left_bottom_size = 10
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(
slides.ShapeType.CUSTOM, shape_x, shape_y, shape_width, shape_height)
point1 = draw.PointF(left_top_size, 0)
point2 = draw.PointF(shape_width - right_top_size, 0)
point3 = draw.PointF(shape_width, shape_height - right_bottom_size)
point4 = draw.PointF(left_bottom_size, shape_height)
point5 = draw.PointF(0, left_top_size)
geometry_path = slides.GeometryPath()
geometry_path.move_to(point1)
geometry_path.line_to(point2)
geometry_path.arc_to(right_top_size, right_top_size, 180, -90)
geometry_path.line_to(point3)
geometry_path.arc_to(right_bottom_size, right_bottom_size, -90, -90)
geometry_path.line_to(point4)
geometry_path.arc_to(left_bottom_size, left_bottom_size, 0, -90)
geometry_path.line_to(point5)
geometry_path.arc_to(left_top_size, left_top_size, 90, -90)
geometry_path.close_figure()
shape.set_geometry_path(geometry_path)
presentation.save("curved_corners.pptx", slides.export.SaveFormat.PPTX)

判斷形狀的幾何是否封閉
封閉形狀指其所有邊緣均相連,形成一個沒有間隙的單一邊界。此類形狀可為簡單的幾何圖形,也可為複雜的自訂輪廓。以下程式碼示例說明如何檢查形狀的幾何是否為封閉:
def is_geometry_closed(geometry_shape):
is_closed = None
for geometry_path in geometry_shape.get_geometry_paths():
data_length = len(geometry_path.path_data)
if data_length == 0:
continue
last_segment = geometry_path.path_data[data_length - 1]
is_closed = last_segment.path_command == PathCommandType.CLOSE
if not is_closed:
return False
return is_closed
常見問題
取代幾何後,填色與輪廓會怎樣?
樣式仍保留在形狀上,只有輪廓會改變。填色與輪廓會自動套用到新的幾何上。
如何正確地同時旋轉自訂形狀與其幾何?
使用形狀的 rotation 屬性;因為幾何繫結於形狀自身的座標系統,會隨形狀一起旋轉。
我可以將自訂形狀轉換為影像以「鎖定」結果嗎?