#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.
Вот код из репозитория 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 выполняет фактическое масштабирование.