图像处理

1 投票
4 回答
1759 浏览
提问于 2025-04-16 03:12

这是一个作业,我花了很多心思,因为我刚开始学习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 个回答

0

我建议的解决办法是,先制作一张包含所有字符的图片,并且把每个字符的位置(上、下、左、右)都标记好。然后再把需要的字符部分从这张字符图片中转移到新的输出图片里。

0

其实,经过进一步阅读,我觉得问题在于你试图把一个字符的值直接赋给一个像素。你需要找到一种方法,真正把字符画到图像上(并且要在图像的边界内)。

另外,顺便提一下,因为你在使用 for index,value in enumerate(phrase):

你可以直接用 value,而不是 phrase[index]

2

你似乎把两个完全不同的概念搞混了。根据你提供的示例代码,我们假设:

srcImage = 一张用 Python 图像库生成的图片,来源于 lolmini.jpg
phrase = 一个字符串,内容是 'Hi'

你想让 phrase 这个文本出现在 srcImage 这张图片上。你现在的代码显示,你打算通过访问图片的每一个像素,然后给它们赋值来实现这个目标。

这样做不太行,主要有两个原因:

  • 你在处理的是单个像素。像素是一个图像元素,它一次只能显示一种颜色。你不能用一个像素来表示一个字母。像素就像一个小点。你需要多个像素组合在一起,才能形成我们能认出的字母形状。

  • 你的 Hi 这个文本实际看起来是什么样的?当你想象它写在图片上时,字母是细的还是粗的?大小是否不同?是斜体吗?看起来像手写的吗?这些都是字体的特征。目前,你的程序不知道这些字母应该是什么样子。你需要告诉程序一个字体的名称,这样它才能知道如何把 phrase 中的字母画到图片上。

Python 图像库里有一个专门帮助你绘制字体的模块。它的文档在这里:
The ImageFont Module

你的代码显示你有一个大致的思路——循环每个字母,把它放到图片上,然后增加 x 值,以确保下一个字母不会重叠。不过,你需要加载一个字体,而不是直接处理图片的像素,使用上面链接的库中的方法把字母画到图片上。

如果你查看链接文档中的 draw.text() 函数,你会发现其实可以跳过逐个字母循环的步骤,而是直接把整个字符串传给图片。

我本可以提供示例代码,但因为这是一个作业,我故意没有提供。希望通过链接的文档和你现有的代码,你能顺利完成这个任务。

编辑

我刚看到你对另一个回答的评论,提到你只能使用 getpixel()putpixel() 来在源图像上绘制。如果真是这样,那你的工作量就大大增加了。

我之前的评论依然有效——单个像素无法表示一个字母。假设你不能使用任何外部代码,你需要创建数据结构,包含多个像素的位置,然后把它们都绘制在特定的位置,以表示一个特定的字母。

然后你需要为每个你想支持的字母都这样做。

如果你能把作业的内容逐字写出来,我想这会帮助大家更好地理解你的所有限制条件。

撰写回答