图像处理
这是一个作业,我花了很多心思,因为我刚开始学习Python编程:
我正在运行一个函数,这个函数需要输入一张图片和一个短语(空格会被去掉,所以只需要文本)作为参数。我已经得到了所有的导入和预处理代码,我只需要实现这个函数。我只能使用getpixel、putpixel、load和save这些功能。所以编写这个代码对我来说很困难。
def InsertoImage(srcImage, phrase):
pix = srcImage.load()
for index,value in enumerate(phrase):
pix[10+index,15] = phrase[index]
srcImage.save()
pass
这段代码出现了“系统错误”,提示“新样式的参数格式,但参数不是元组”。
编辑:
C:\Users\Nave\Desktop\a1>a1_template.py lolmini.jpg Hi
Traceback (most recent call last):
File "C:\Users\Nave\Desktop\a1\a1_template.py", line 31, in <module>
doLOLImage(srcImage, phrase)
File "C:\Users\Nave\Desktop\a1\a1_template.py", line 23, in doLOLImage
pix[10+index,15] = phrase[index]
SystemError: new style getargs format but argument is not a tuple
编辑:
好的,谢谢,我明白了,现在发代码,但我在if语句上遇到了错误,不知道为什么if语句不工作,这里是完整的代码,之前没有全部添加很抱歉:
来自 future 的导入 division
字母、数字和标点符号是将(大写)
字符映射到表示该字符的图像的字典
注意:没有存储空格字符!
来自 imageproc 的导入 letters、numbers、punctuation、preProcess
这是需要实现的函数
def InserttoImage(srcImage, phrase):
pix = srcImage.load()
for index,value in enumerate(phrase):
if value in letters:
pix[10+index, 15] = letters[value]
elif value in numbers:
pix[10+index, 15] = numbers[value]
elif value in punctuation:
pix[10+index, 15] = punctuation[value]
srcImage.save()
pass
当从命令行调用这个脚本时,会执行这段代码:
'python .py'
如果 name == 'main':
srcImage, phrase = preProcess()
InserttoImage(srcImage, phrase)
谢谢,字母、数字和标点符号是字典,可以查看键元素并打开图像(字体)。但在pix[10+index, 15]上仍然有问题,因为它出现了错误:
pix[10+index, 15] = letters[value]
系统错误:新样式的参数格式,但参数不是元组
4 个回答
我建议的解决办法是,先制作一张包含所有字符的图片,并且把每个字符的位置(上、下、左、右)都标记好。然后再把需要的字符部分从这张字符图片中转移到新的输出图片里。
其实,经过进一步阅读,我觉得问题在于你试图把一个字符的值直接赋给一个像素。你需要找到一种方法,真正把字符画到图像上(并且要在图像的边界内)。
另外,顺便提一下,因为你在使用 for index,value in enumerate(phrase):
你可以直接用 value,而不是 phrase[index]。
你似乎把两个完全不同的概念搞混了。根据你提供的示例代码,我们假设:
srcImage
= 一张用 Python 图像库生成的图片,来源于 lolmini.jpg
。
phrase
= 一个字符串,内容是 'Hi'
。
你想让 phrase
这个文本出现在 srcImage
这张图片上。你现在的代码显示,你打算通过访问图片的每一个像素,然后给它们赋值来实现这个目标。
这样做不太行,主要有两个原因:
你在处理的是单个像素。像素是一个图像元素,它一次只能显示一种颜色。你不能用一个像素来表示一个字母。像素就像一个小点。你需要多个像素组合在一起,才能形成我们能认出的字母形状。
你的
Hi
这个文本实际看起来是什么样的?当你想象它写在图片上时,字母是细的还是粗的?大小是否不同?是斜体吗?看起来像手写的吗?这些都是字体的特征。目前,你的程序不知道这些字母应该是什么样子。你需要告诉程序一个字体的名称,这样它才能知道如何把phrase
中的字母画到图片上。
Python 图像库里有一个专门帮助你绘制字体的模块。它的文档在这里:
The ImageFont Module
你的代码显示你有一个大致的思路——循环每个字母,把它放到图片上,然后增加 x 值,以确保下一个字母不会重叠。不过,你需要加载一个字体,而不是直接处理图片的像素,使用上面链接的库中的方法把字母画到图片上。
如果你查看链接文档中的 draw.text()
函数,你会发现其实可以跳过逐个字母循环的步骤,而是直接把整个字符串传给图片。
我本可以提供示例代码,但因为这是一个作业,我故意没有提供。希望通过链接的文档和你现有的代码,你能顺利完成这个任务。
编辑:
我刚看到你对另一个回答的评论,提到你只能使用 getpixel()
和 putpixel()
来在源图像上绘制。如果真是这样,那你的工作量就大大增加了。
我之前的评论依然有效——单个像素无法表示一个字母。假设你不能使用任何外部代码,你需要创建数据结构,包含多个像素的位置,然后把它们都绘制在特定的位置,以表示一个特定的字母。
然后你需要为每个你想支持的字母都这样做。
如果你能把作业的内容逐字写出来,我想这会帮助大家更好地理解你的所有限制条件。