裁剪后的图像的最大宽度的文件夹

问题描述 投票:1回答:1

是否有办法获取裁剪图像的文件夹,获取图像的最大宽度,然后用右边的白色填充其余图像,使它们的宽度相同?

我已经编写了一个python脚本,该脚本会容纳一个图像文件夹,将其白色边框剪掉,然后在第二步中将它们重新缩放为PDF。图片是脚本中的引理,这就是为什么不是所有图片都占据整个线宽的原因。

问题是,如果图像在裁切之前未填充线宽,则会自动裁切白色,然后图像宽度过窄,然后将其粘贴到PDF中,则将其放大并移出比例。因此,最好先裁剪它们,然后填充它们,然后再继续创建PDF。

下面是整个代码,只有修剪和裁切方法可能会受到此问题的影响。

# All the necessary parameters are accessible after line 55,
# but can of course be changed manually in the Code


# imports for the crop, rename to avoid conflict with reportlab Image import
from PIL import Image as imgPIL
from PIL import ImageChops
import os.path, sys

# import for the PDF creation
import glob
from reportlab.lib.pagesizes import A4
from reportlab.lib import utils
from reportlab.platypus import Image, SimpleDocTemplate, Spacer
from reportlab.lib.units import mm, inch

# get os path for Cropping
path = (os.path.dirname(os.path.abspath("cropPDF.py")))
dirs = os.listdir(path)


def trim(im, border="white"):
    bg = imgPIL.new(im.mode, im.size, border)
    diff = ImageChops.difference(im, bg)
    bbox = diff.getbbox()
    if bbox:
        return im.crop(bbox)


def crop():
    for item in dirs:
        try:
            fullpath = os.path.join(path, item)
            if os.path.isfile(fullpath):
                im = imgPIL.open(fullpath)
                f, e = os.path.splitext(fullpath)
                imCrop = trim(im, "white")
                imCrop.save(f + ".png", "PNG", quality=100)
        except:
            pass


def add_page_number(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', numberFontSize)
    page_number_text = "%d" % (doc.page)
    canvas.drawCentredString(
        pageNumberSpacing * mm,
        pageNumberSpacing * mm,
        page_number_text
    )
    canvas.restoreState()


#############################

executeCrop = True

outputName = "output.pdf"

margin = 0.5
imageWidthDefault = 550
spacerHeight = 7
scalingIfImageTooTall = 0.95  # larger than 95 can result in an empty page after the image

includePagenumbers = True
numberFontSize = 10
pageNumberSpacing = 5

############################

if executeCrop:
    crop()

filelist = glob.glob("*.png")  # Get a list of files in the current directory
filelist.sort()

doc = SimpleDocTemplate(
    outputName,
    topMargin=margin * mm,
    leftMargin=margin * mm,
    rightMargin=margin * mm,
    bottomMargin=margin * mm,
    pagesize=A4
)

story = []  # create the list of images for the PDF

for fn in filelist:
    img = utils.ImageReader(fn)
    img_width, img_height = img.getSize()  # necessary for the aspect ratio
    aspect = img_height / float(img_width)

    documentHeight = doc.height

    imageWidth = imageWidthDefault
    imageHeight = imageWidth * aspect

    if imageHeight > documentHeight:
        imageHeight = documentHeight * scalingIfImageTooTall
        imageWidth = imageHeight / aspect

    img = Image(
        fn,
        width=imageWidth,
        height=imageHeight
    )
    story.append(img)
    space = Spacer(width=0, height=spacerHeight)
    story.append(space)

if includePagenumbers and not len(filelist) == 0:  # if pagenumbers are desired, or not
    doc.build(
        story,
        onFirstPage=add_page_number,
        onLaterPages=add_page_number,
    )
elif not len(filelist) == 0:
    doc.build(story)
else:  # to prevent an empty PDF that can't be opened
    print("no files found")
python pdf crop reportlab pad
1个回答
0
投票

我现在已经使用from PIL import ImageOps创建了一个解决方案>

这两个新方法提供了所需的功能,第一个方法找到所有图像的最大宽度,第二个方法为文件夹中的每个图像创建一个空白图像,然后粘贴原始的上方图像:

def findMaxWidth():
maxWidth = 0
for item in dirs:
    try:
        fullpath = os.path.join(path, item)
        if os.path.isfile(fullpath):
            im = imgPIL.open(fullpath)
            maxWidth = max(maxWidth, im.size[0])
    except:
        pass
return maxWidth


def padImages():
maxWidth = findMaxWidth()
for item in dirs:
    try:
        fullpath = os.path.join(path, item)
        if os.path.isfile(fullpath):
            im = imgPIL.open(fullpath)
            f, e = os.path.splitext(fullpath)

            width,height = im.size #get the image dimensions, the height is needed for the blank image

            image = imgPIL.new('RGB', (maxWidth, height), (255, 255, 255)) #create a white image with the max width         
            image.paste(im, (0,0) ) #paste the original image overtop the blank one, flush on the left side
            image.save(f + ".png", "PNG", quality=100)
    except:
        pass
© www.soinside.com 2019 - 2024. All rights reserved.