Есть ли какой-либо способ поместить изображение в pptx без изменения соотношения сторон изображения с помощью пакета pptx python

#python #python-pptx #wand

Вопрос:

У меня есть задача создать водяные знаки на изображениях и создать pptx, используя эти изображения, и я не должен изменять соотношение сторон изображения в соответствии с правилами

Соотношение изображений = 4000×6016

Без изменения соотношения изображения не помещаются внутри pptx Есть ли способ разместить изображение в pptx без изменения соотношения сторон изображения с помощью пакета pptx python

Ожидаемый выход:
введите описание изображения здесь

текущий выход
введите описание изображения здесь

Код:

 from wand.image import Image
from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
blankSideLayout = prs.slide_layouts[4]

def makePPTX(path):
   slide = prs.slides.add_slide(blankSideLayout)
   slide.shapes.title.text = "sample title"
   slide.placeholders[2].text = "Sample Sub Title" 
   slide.shapes.add_picture(path, Inches(1), Inches(3))
   prs.save("slides.pptx")

logoImg = Image(filename='logo.jpg')
logoImg.transparentize(0.33)
  
img = Image(filename='img.jpg')

img.composite_channel("all_channels",logoImg,"dissolve",20,20)
    
img.save(filename='imgwatermark.jpg')

makePPTX('imgwatermark.jpg')
    
 

Ответ №1:

ДА. В моем проекте (md2pptx) Я делаю это.

По сути, ты

  1. Определите размеры рисунка и пространство, в котором вы хотите его разместить.
  2. Вы определяете, какое измерение вам нужно масштабировать и на сколько. Ответы на 1. направьте вас в этом.
  3. Вы создаете графическое масштабирование в соответствии с 2.

Вот код из репозитория md2pptx:

 def scalePicture(maxPicWidth, maxPicHeight, imageWidth, imageHeight):
    heightIfWidthUsed = maxPicWidth * imageHeight / imageWidth
    widthIfHeightUsed = maxPicHeight * imageWidth / imageHeight

    if heightIfWidthUsed > maxPicHeight:
        # Use the height to scale
        usingHeightToScale = True

        picWidth = widthIfHeightUsed
        picHeight = maxPicHeight

    else:
        # Use the width to scale
        usingHeightToScale = False

        picWidth = maxPicWidth
        picHeight = heightIfWidthUsed
    return (picWidth, picHeight, usingHeightToScale)
 

Основная трудность будет заключаться в определении размеров исходной графики.

Вот код, который я позаимствовал для этого:

 import imghdr, struct

def get_image_size(fname):
    """Determine the image type of fhandle and return its size.
    from draco"""
    try:
        with open(fname, "rb") as fhandle:
            head = fhandle.read(24)
            if len(head) != 24:
                return -1, -1
            if imghdr.what(fname) == "png":
                check = struct.unpack(">i", head[4:8])[0]
                if check != 0x0D0A1A0A:
                    return
                width, height = struct.unpack(">ii", head[16:24])
            elif imghdr.what(fname) == "gif":
                width, height = struct.unpack("<HH", head[6:10])
            elif imghdr.what(fname) == "jpeg":
                try:
                    fhandle.seek(0)  # Read 0xff next
                    size = 2
                    ftype = 0
                    while not 0xC0 <= ftype <= 0xCF:
                        fhandle.seek(size, 1)
                        byte = fhandle.read(1)
                        while ord(byte) == 0xFF:
                            byte = fhandle.read(1)
                        ftype = ord(byte)
                        size = struct.unpack(">H", fhandle.read(2))[0] - 2
                    # We are at a SOFn block
                    fhandle.seek(1, 1)  # Skip 'precision' byte.
                    height, width = struct.unpack(">HH", fhandle.read(4))
                except Exception:  # IGNORE:W0703
                    return
            else:
                return
            return width, height
    except EnvironmentError:
        return -1, -1
 

Комментарии:

1. Пожалуйста. Приятно, что python-pptx выполняет фактическое масштабирование.