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