Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PIL(或其他任何工具)动态调整图像大小,使之与文本大小一致?_Python_Python Imaging Library - Fatal编程技术网

Python 如何使用PIL(或其他任何工具)动态调整图像大小,使之与文本大小一致?

Python 如何使用PIL(或其他任何工具)动态调整图像大小,使之与文本大小一致?,python,python-imaging-library,Python,Python Imaging Library,我希望创建的图像的大小根据写入的字符串动态更改。我的代码目前所做的是,通过PIL和docx实现,从word文档中获取数据,并将其放入单个字符串中,然后通过一些循环对其进行解析,以便为字符串中的特定文本摘录输出图像,这些文本摘录从关键字一直到零件号。为了仅显示完全必要的内容,以下是我需要帮助的代码部分: for match in find_matches(text=docText, keywords=("responsive", "detecting", &

我希望创建的图像的大小根据写入的字符串动态更改。我的代码目前所做的是,通过PIL和docx实现,从word文档中获取数据,并将其放入单个字符串中,然后通过一些循环对其进行解析,以便为字符串中的特定文本摘录输出图像,这些文本摘录从关键字一直到零件号。为了仅显示完全必要的内容,以下是我需要帮助的代码部分:

for match in find_matches(text=docText, keywords=("responsive", "detecting", "providing")):
    W, H = 300, 300
    body = Image.new('RGB', (W, H), (255, 255, 255))
    border = Image.new('RGB', (W + 4, H + 4), (0, 0, 0))
    border.save('border.png')
    body.save('body.png')
    patent = Image.open('border.png')
    patent.paste(body, (2, 2))
    draw = ImageDraw.Draw(patent)
    font = ImageFont.load_default()
    current_h, pad = 100, 20

    for key in textwrap.wrap(match, width=45):
        line = key.encode('utf-8')
        w, h = draw.textsize(line, font=font)
        draw.text(((W - w) / 2, current_h), line, (0, 0, 0), font=font)
        current_h += h + pad
    for count, matches in enumerate(match):
        patent.save(f'{match}.png')
从这段代码和我的其他代码中,我还有一个源文档文件,我将仅显示以下图像:

最后,根据我当前的代码,我能够获得以下图像输出:

我们的目标是能够删除图像中的所有空白,或者尽可能多地删除空白,并将其添加到创建图像的自动过程中,以使空白尽可能少,并使图像边框以相同的框格式正好围绕文本。作为一个额外的好处,这是完全不需要的,因为我主要是问空白的问题,如果有一个快速修复,使“249C”和类似的零件号在最后一行没有其他文字加入他们,这也将是伟大的,但我的首要问题是使图像适合文本的大小

这是一个我希望我的输出是什么样子的示例,除了每个框都是它自己的图像外:


似乎您可以完全控制图像上的文本,这意味着如果您将文本添加到具有白色背景的图像中,您可以准确地知道黑色像素的位置。使用此图像,您可以通过计算每行/每列中的黑色像素来确定“边框”,并可以获得边框的位置

例如:

image  = cv2.imread("image-file")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
nrows, ncols = grayImage.shape
isBlackPixelMat = grayImage < 100
numOfPixelInColumn = isBlackPixelMat.sum(axis=0)

# find start column
k = 0;
while k < ncols and numOfPixelInColumn[k] == 0:
    k += 1
startColumn = k

# find end column
k = ncols - 1

while k > 0 and numOfPixelInColumn[k] == 0:
    k -= 1
endColumn = k

# draw lines

cv2.line(image, (startColumn, 0), (startColumn, ncols - 1), color=(255, 0, 0))
cv2.line(image, (endColumn, 0), (endColumn, ncols - 1), color=(255, 0, 0))
image=cv2.imread(“图像文件”)
grayImage=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
nrows,ncols=灰度图像.shape
isBlackPixelMat=灰度图像<100
numOfPixelInColumn=isBlackPixelMat.sum(轴=0)
#查找起始列
k=0;
当k0且numOfPixelInColumn[k]==0时:
k-=1
endColumn=k
#划线
线(图像,(startColumn,0),(startColumn,ncols-1),颜色=(255,0,0))
线(图像,(endColumn,0),(endColumn,ncols-1),颜色=(255,0,0))

似乎您可以完全控制图像上的文本,这意味着如果您将文本添加到具有白色背景的图像中,您可以准确地知道黑色像素的位置。使用此图像,您可以通过计算每行/每列中的黑色像素来确定“边框”,并可以获得边框的位置

例如:

image  = cv2.imread("image-file")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
nrows, ncols = grayImage.shape
isBlackPixelMat = grayImage < 100
numOfPixelInColumn = isBlackPixelMat.sum(axis=0)

# find start column
k = 0;
while k < ncols and numOfPixelInColumn[k] == 0:
    k += 1
startColumn = k

# find end column
k = ncols - 1

while k > 0 and numOfPixelInColumn[k] == 0:
    k -= 1
endColumn = k

# draw lines

cv2.line(image, (startColumn, 0), (startColumn, ncols - 1), color=(255, 0, 0))
cv2.line(image, (endColumn, 0), (endColumn, ncols - 1), color=(255, 0, 0))
image=cv2.imread(“图像文件”)
grayImage=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
nrows,ncols=灰度图像.shape
isBlackPixelMat=灰度图像<100
numOfPixelInColumn=isBlackPixelMat.sum(轴=0)
#查找起始列
k=0;
当k0且numOfPixelInColumn[k]==0时:
k-=1
endColumn=k
#划线
线(图像,(startColumn,0),(startColumn,ncols-1),颜色=(255,0,0))
线(图像,(endColumn,0),(endColumn,ncols-1),颜色=(255,0,0))

这非常接近,但我如何将颜色更改为黑色?此外,如何在代码中实现这一点?我发现在for循环中,我很难将注意力集中在变量等的放置位置。这非常接近,但我如何将颜色更改为黑色?此外,如何在代码中实现这一点?我发现使用for循环时,我很难将注意力集中在变量等的放置位置。