有没有什么方法可以在不使用 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) 中,我这样做了。
本质上是你
- 算出图形的尺寸和space你想把它放进去。
- 你弄清楚你需要缩放哪个维度以及缩放多少。 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
我的任务是在图像中创建水印并使用这些图像创建 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) 中,我这样做了。
本质上是你
- 算出图形的尺寸和space你想把它放进去。
- 你弄清楚你需要缩放哪个维度以及缩放多少。 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