Hướng dẫn python-pptx replace image - python-pptx thay thế hình ảnh

Xin chào Scanny , Tôi muốn hỏi làm thế nào có thể thay thế hình ảnh hình dạng. Tôi đã viết mã :
I wrote code:

    presentation = Presentation(ppt_file_name)
    shape = presentation.slides[0].shapes[0]
    print(type(shape))

Bản in bảng điều khiển:


Sau đó, tôi đọc pptx-tài liệu và tìm hình ảnh.

Tôi tìm thấy điều này

Hướng dẫn python-pptx replace image - python-pptx thay thế hình ảnh

Sau đó, tôi tạo một đối tượng hình ảnh và mã cập nhật:

    presentation = Presentation(ppt_file_name)
    shape = presentation.slides[0].shapes[0]
    image = Image.from_file('res/bg_1.png')
    shape.image = image

In bảng điều khiển :

Traceback (most recent call last):
  File "F:/Python/PPTHelper.py", line 111, in 
    shape.image = image
AttributeError: can't set attribute

Nếu bạn biết cách khắc phục nó, hoặc có một phương pháp khác để làm điều đó. Xin vui lòng cho tôi biết! ths ~
Please tell me! ths~

Một tệp .pptx là một thiết bị lưu trữ zip. Định dạng của nó được chỉ định bởi Công ước Bao bì mở (OPC), cũng như các tệp .docx.xlsx. Theo cách nói của OPC, Zip-Archive được gọi là "gói".

Các byte của một "tệp" hình ảnh xuất hiện trong một bản trình bày được lưu trữ trong gói .pptx dưới dạng "thành viên" riêng biệt của thiết bị lưu trữ zip, có thể tại một đường dẫn như


0. Nó không nên mất quá nhiều tiếng rình mò để tìm thấy nó trong đó.

Phần còn lại của thông tin được sử dụng để hiển thị hình ảnh, như vị trí và kích thước, được lưu trữ ở nơi khác. Vì vậy, bạn có thể có được một cách nhất định trên đường chỉ bằng cách thay thế các byte hình ảnh hiện có bằng các byte hình ảnh mới.

Có một vài thách thức bạn có thể dự đoán.

  1. Bạn cần xác định thành viên hình ảnh nào (ví dụ: ppt/media/Image42.png) đi với hình ảnh hình ảnh nào trên slide nào.

  2. Nếu tỷ lệ khung hình không chính xác giống nhau, hình ảnh kết quả sẽ xuất hiện "kéo dài" theo chiều này hay chiều khác.

Nói chung, bạn có thể tấn công vấn đề bằng cách thao túng kho lưu trữ zip hoặc bằng cách để


1 đưa bạn đi xa nhất có thể và sau đó đi sâu vào bên trong để đi phần còn lại của con đường.

Nếu bạn sử dụng


1 để có được tham chiếu đến hình ảnh,

3 sẽ cung cấp cho bạn đối tượng

4 cho hình ảnh mà nó chứa. Mã cho lớp đó ở đây: https://github.com/scanny/python-pptx/blob/master/pptx/parts/image.py#l139

Tôi sẽ thử gán các byte hình ảnh mới cho


5 sau đó lưu và xem điều gì sẽ xảy ra. Kích thước và vị trí của hình ảnh bạn đã sử dụng để có thể được điều chỉnh để phù hợp với tỷ lệ khung hình mới nếu cần thiết và đi theo tuyến đường này cho phép

1 chăm sóc tất cả các chi tiết đóng gói như tệp hình ảnh trong gói nào được thay đổi.

Sau đó, bạn sẽ cần giải quyết bất kỳ thách thức bổ sung nào bằng cách hiểu cách thức hoạt động của mã hiện tại và xem bạn có thể làm gì từ đó. Bạn có thể hỏi những câu hỏi mới khi họ đi lên nếu bạn đi theo con đường đó.


Cập nhật: Được rồi, có vẻ như mục


5 không được viết, nó cần phải là

8 (

5 chỉ là một "bản sao" chỉ đọc, nói đại khái).

shape = {picture shape of interest}
slide_part, rId = shape.part, shape._element.blip_rId
image_part = slide_part.related_parts[rId]
image_part.blob = new_blob

Thay thế hình ảnh bên trong bộ sưu tập hình ảnh trình bày

Aspose.slides cho Python thông qua .NET cung cấp một phương thức API đơn giản để thay thế các hình ảnh bên trong Bộ sưu tập hình ảnh trình bày. Vui lòng làm theo các bước dưới đây:

  1. Tải tệp trình bày với hình ảnh bên trong nó bằng lớp trình bày.
  2. Tải một hình ảnh từ tệp trong mảng byte.
  3. Thay thế hình ảnh đích bằng hình ảnh mới trong mảng byte
  4. Trong cách tiếp cận thứ hai, hãy tải hình ảnh trong đối tượng hình ảnh và thay thế hình ảnh đích bằng hình ảnh được tải.
  5. Trong cách tiếp cận thứ ba thay thế hình ảnh bằng hình ảnh đã được thêm vào trong bộ sưu tập hình ảnh trình bày.
  6. Viết bản trình bày sửa đổi dưới dạng tệp pptx.

import aspose.pydrawing as draw
import aspose.slides as slides

def read_all_bytes(file_name):
    with open(file_name, "rb") as stream:
        return stream.read()

#Instantiate the presentation
with slides.Presentation("pres.pptx") as presentation:

    #the first way
    data = read_all_bytes("image_0.jpeg")
    oldImage = presentation.images[0]
    oldImage.replace_image(data)

    #the second way
    newImage = draw.Image.from_file("image_1.jpeg")
    oldImage = presentation.images[1]
    oldImage.replace_image(newImage)

    #the third way
    oldImage = presentation.images[2]
    oldImage.replace_image(presentation.images[3])

    #Save the presentation
    presentation.save("replace_image-out.pptx", slides.export.SaveFormat.PPTX)