有没有什么方法可以在不使用 python pptx 包更改图像的纵横比的情况下使图像适合 pptx

Is there any way to fit an image in pptx without changing the aspect ratio of an image using python pptx package

我的任务是在图像中创建水印并使用这些图像创建 pptx 而且我不应该按照规则更改图像的纵横比

图像比例 = 4000x6016

在不改变比例的情况下,图片不适合 pptx 有没有什么方法可以在不使用 python pptx package

改变图像纵横比的情况下使图像适合 pptx

预期输出:

当前输出

代码:

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')
    

是的。在我的项目 (md2pptx) 中,我这样做了。

本质上是你

  1. 算出图形的尺寸和space你想把它放进去。
  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