在 Python 中使用 Wand 创建图像
Image creation with Wand in Python
我正在从事的项目的目标是从 word 文档中获取内容,然后输出包含边框框的单个图像,边框框包含我自动收集的文本段我的代码。这是我需要的示例:
由于我自己的一点点知识和其他人的大量知识,我已经设法完成了这个项目 90% 的步法。我的代码已经从 word 文档中获取文本并自动获取我想要的内容。尝试模仿此图像时会出现问题。我正在使用 Wand 创建图像,但我仍然不能让它正常工作。我知道我离得很近,但我不确定我错过了什么。以下是严格的图像创建代码:
from wand.image import Image
from wand.drawing import Drawing
target_width = 500
target_height = 0
y_offset = 0
y_padding = 4
x_padding = 5
with Image(width=2000, height=2000, pseudo='xc:white') as img:
for match in find_matches(text=fullText):
ct += 1
with Drawing() as ctx:
ctx.font_size = 20
ctx.text_alignment = 'center'
words = match.split(" ")
words.append("\n" + str(ct))
word_count = len(words)
while True:
temp_text = rebuild_text(words, word_count)
metrics = ctx.get_font_metrics(img, temp_text, multiline=True)
if metrics.text_width > target_width:
word_count -= 1
else:
text = temp_text
target_height = int(metrics.text_height + 0.5)
break
ctx.push()
ctx.fill_color = 'white'
ctx.stroke_width = 3
ctx.stroke_color = 'black'
ctx.rectangle(2, y_offset + y_padding, width=2*x_padding+target_width,
height=6*y_padding+target_height)
ctx.pop()
ctx.text(x_padding + (target_width // 2), 16 + 6*y_padding+y_offset, text)
ctx(img)
y_offset = target_height + 100*y_padding + 7
img.trim()
img.save(filename='patdrawdemoTest.png')
我试过一遍又一遍地修改这段代码,但都无济于事。我知道我想要的所有文本都被传递了,因为我添加了一个打印语句来确保这一点,并且在到处乱搞代码之后,有时我发现有很多重叠的文本,但我永远不会得到超过三个带边框的框。以下是我通过更改值获得的一些输出示例:
我无法复制文本重叠输出,但是,以上只是一些示例。我不确定它是否有帮助,但它们之间的区别在于文本和矩形等的 y 轴相关值。
我需要的文本行是用python中的docx库获取的,然后将其放入变量中;这不是一个简单的字符串。此外,此代码必须适用于任何场合;无论是 5 个文本框、2 个、8 个还是 100 个文本框,它都必须创建包含那么多文本框的图像。以下是我已经解析并通过上面的代码传递的文本:
在第一区域存储与运输工具的操作方式相关的第一数据
243
在第二区域存储与交通工具的运行方式相关的第二数据
244
根据综合能源消耗效率修改交通工具的功能
245
确定综合能源消耗效率,其中确定包括对等组之间的区块链共识,对等组包括传输、服务器和至少一个其他传输中的一个或多个
246
基于区块链共识,执行智能合约记录区块链上的综合能源消耗效率
247
如果我能得到任何帮助,我将不胜感激,因为我完全被难住了。请让我知道我是否可以更清楚,或者我是否遗漏了一些东西来帮助您回答我的问题。谢谢。
@emconnville 在我 post 编辑这个问题之前给了我另一个 post 需要的答案,但是有一个错误让我花了很长时间才看到,但这是我的问题:
def to_chunks(words, size):
for idx in range(0, len(words), size):
yield words[idx:idx + size]
def rebuild_text(words, size, ct):
ret = "\n".join([" ".join(w) for w in to_chunks(words, size)])
ret += "\n" + ct
return ret
target_width = 375
target_height = 0
y_offset = 0
y_padding = 5
x_padding = 6
with Image(width=2000, height=5000, pseudo='xc:white') as img:
for match in find_matches(text=fullText):
ct += 1
with Drawing() as ctx:
ctx.font_size = 20
ctx.text_alignment = 'center'
words = match.split(" ")
word_count = len(words)
while True:
temp_text = rebuild_text(words, word_count, str(ct))
metrics = ctx.get_font_metrics(img, temp_text, multiline=True)
if metrics.text_width > target_width:
word_count -= 1
else:
text = temp_text
target_height = int(metrics.text_height + 1)
break
ctx.push()
ctx.fill_color = 'white'
ctx.stroke_width = 3
ctx.stroke_color = 'black'
ctx.rectangle(2, y_offset + y_padding, width=2*x_padding+target_width,
height=2*y_padding+target_height)
ctx.pop()
ctx.text(x_padding+2 + (target_width // 2), 10 + 4*y_padding+y_offset, text)
ctx(img)
y_offset += target_height + 4*y_padding - 2
img.trim()
img.save(filename='patdrawdemoTest.png')
错误出现在这个特定的代码块中:
ctx.text(x_padding+2 + (target_width // 2), 10 + 4*y_padding+y_offset, text)
ctx(img)
y_offset += target_height + 4*y_padding - 2
img.trim()
img.save(filename='patdrawdemoTest.png')
其中“y_offset += target_height + 4*y_padding - 2”最初只是“y_offset = target...” 所以...基本上我只是错过了 +=
但愿我没瞎。
我正在从事的项目的目标是从 word 文档中获取内容,然后输出包含边框框的单个图像,边框框包含我自动收集的文本段我的代码。这是我需要的示例:
由于我自己的一点点知识和其他人的大量知识,我已经设法完成了这个项目 90% 的步法。我的代码已经从 word 文档中获取文本并自动获取我想要的内容。尝试模仿此图像时会出现问题。我正在使用 Wand 创建图像,但我仍然不能让它正常工作。我知道我离得很近,但我不确定我错过了什么。以下是严格的图像创建代码:
from wand.image import Image
from wand.drawing import Drawing
target_width = 500
target_height = 0
y_offset = 0
y_padding = 4
x_padding = 5
with Image(width=2000, height=2000, pseudo='xc:white') as img:
for match in find_matches(text=fullText):
ct += 1
with Drawing() as ctx:
ctx.font_size = 20
ctx.text_alignment = 'center'
words = match.split(" ")
words.append("\n" + str(ct))
word_count = len(words)
while True:
temp_text = rebuild_text(words, word_count)
metrics = ctx.get_font_metrics(img, temp_text, multiline=True)
if metrics.text_width > target_width:
word_count -= 1
else:
text = temp_text
target_height = int(metrics.text_height + 0.5)
break
ctx.push()
ctx.fill_color = 'white'
ctx.stroke_width = 3
ctx.stroke_color = 'black'
ctx.rectangle(2, y_offset + y_padding, width=2*x_padding+target_width,
height=6*y_padding+target_height)
ctx.pop()
ctx.text(x_padding + (target_width // 2), 16 + 6*y_padding+y_offset, text)
ctx(img)
y_offset = target_height + 100*y_padding + 7
img.trim()
img.save(filename='patdrawdemoTest.png')
我试过一遍又一遍地修改这段代码,但都无济于事。我知道我想要的所有文本都被传递了,因为我添加了一个打印语句来确保这一点,并且在到处乱搞代码之后,有时我发现有很多重叠的文本,但我永远不会得到超过三个带边框的框。以下是我通过更改值获得的一些输出示例:
我无法复制文本重叠输出,但是,以上只是一些示例。我不确定它是否有帮助,但它们之间的区别在于文本和矩形等的 y 轴相关值。
我需要的文本行是用python中的docx库获取的,然后将其放入变量中;这不是一个简单的字符串。此外,此代码必须适用于任何场合;无论是 5 个文本框、2 个、8 个还是 100 个文本框,它都必须创建包含那么多文本框的图像。以下是我已经解析并通过上面的代码传递的文本:
在第一区域存储与运输工具的操作方式相关的第一数据 243
在第二区域存储与交通工具的运行方式相关的第二数据
244
根据综合能源消耗效率修改交通工具的功能
245
确定综合能源消耗效率,其中确定包括对等组之间的区块链共识,对等组包括传输、服务器和至少一个其他传输中的一个或多个 246
基于区块链共识,执行智能合约记录区块链上的综合能源消耗效率
247
如果我能得到任何帮助,我将不胜感激,因为我完全被难住了。请让我知道我是否可以更清楚,或者我是否遗漏了一些东西来帮助您回答我的问题。谢谢。
@emconnville 在我 post 编辑这个问题之前给了我另一个 post 需要的答案,但是有一个错误让我花了很长时间才看到,但这是我的问题:
def to_chunks(words, size):
for idx in range(0, len(words), size):
yield words[idx:idx + size]
def rebuild_text(words, size, ct):
ret = "\n".join([" ".join(w) for w in to_chunks(words, size)])
ret += "\n" + ct
return ret
target_width = 375
target_height = 0
y_offset = 0
y_padding = 5
x_padding = 6
with Image(width=2000, height=5000, pseudo='xc:white') as img:
for match in find_matches(text=fullText):
ct += 1
with Drawing() as ctx:
ctx.font_size = 20
ctx.text_alignment = 'center'
words = match.split(" ")
word_count = len(words)
while True:
temp_text = rebuild_text(words, word_count, str(ct))
metrics = ctx.get_font_metrics(img, temp_text, multiline=True)
if metrics.text_width > target_width:
word_count -= 1
else:
text = temp_text
target_height = int(metrics.text_height + 1)
break
ctx.push()
ctx.fill_color = 'white'
ctx.stroke_width = 3
ctx.stroke_color = 'black'
ctx.rectangle(2, y_offset + y_padding, width=2*x_padding+target_width,
height=2*y_padding+target_height)
ctx.pop()
ctx.text(x_padding+2 + (target_width // 2), 10 + 4*y_padding+y_offset, text)
ctx(img)
y_offset += target_height + 4*y_padding - 2
img.trim()
img.save(filename='patdrawdemoTest.png')
错误出现在这个特定的代码块中:
ctx.text(x_padding+2 + (target_width // 2), 10 + 4*y_padding+y_offset, text)
ctx(img)
y_offset += target_height + 4*y_padding - 2
img.trim()
img.save(filename='patdrawdemoTest.png')
其中“y_offset += target_height + 4*y_padding - 2”最初只是“y_offset = target...” 所以...基本上我只是错过了 +=
但愿我没瞎。