在高中,我们从Python开始,我们被要求使用Pillow
模块编写一个小型图像处理器。目标是打开一个文件,然后选择一个过滤器。在
我尝试编程的第一个过滤器是改变色温。 不过,tkinter还有一个极简的界面,可以显示一些按钮,而且工作起来没有问题。在
下面是打开文件的函数
def Ouvrir():
fichier = askopenfilename(title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('all files','.*')])
global img
img =Image.open(fichier)
l, h = img.size
img.show() #visualisation de l'image
global img2
img2 = img #img2 est une copie de img
它创建一个从文件加载的全局img
图像对象。然后,l
和{
为输出图像创建另一个全局对象映像img2
,它是img
的副本。在
下面是处理图像的函数
^{pr2}$这是一个循环,它扫描整个图像并从img
中提取一个像素,将其rgb值乘以相应的系数,然后将该像素放入img2
问题是它不起作用。它没有给出任何错误,但是当它显示img2
时,它与img1
相同,就像putpixel
函数什么都没有做。在
我检查了很多东西,所以我知道问题既不是rgb值也不是x/y坐标。在
img2 = img
替换img2 = Image.new("RGB", (l, h))
,得到的是一张黑色的图像。在img2.putpixel((x, y), (r, v, b))
替换img2.putpixel((100, 100), (127, 127, 127))
,这样我就可以在左上角附近得到一个灰色像素。但我还是有一个黑色的图像。在然后我试图移除
global img2
img2 = img
从打开文件并将
img2 = Image.new("RGB", (l, h))
就在fenTC.destroy()
之后,我得到了这个:
Exception in Tkinter callback
Traceback (most recent call last):
File "e:\xxxx\programmes\anaconda\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "H:\ISN\Programmes\TP-image\projet.py", line 62, in filtreTC
img2.show()
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\Image.py", line 2016, in show
_show(self, title=title, command=command)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\Image.py", line 2876, in _show
_showxv(image, **options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\Image.py", line 2881, in _showxv
ImageShow.show(image, title, **options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\ImageShow.py", line 51, in show
if viewer.show(image, title=title, **options):
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\ImageShow.py", line 75, in show
return self.show_image(image, **options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\ImageShow.py", line 95, in show_image
return self.show_file(self.save_image(image), **options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\ImageShow.py", line 91, in save_image
return image._dump(format=self.get_format(image), **self.options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\Image.py", line 639, in _dump
self.save(filename, format, **options)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\Image.py", line 1969, in save
save_handler(self, fp, filename)
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\BmpImagePlugin.py", line 319, in _save
(rawmode, stride, -1))])
File "e:\xxxx\programmes\anaconda\lib\site-packages\PIL\ImageFile.py", line 512, in _save
e.setimage(im.im, b)
SystemError: tile cannot extend outside image
基本上很多东西我都不知道它是什么意思除了:
SystemError: tile cannot extend outside image
我检查了x和y坐标,它们从来没有越界,所以我不明白这是什么错误。在
我花了几个小时试图找出问题所在,并尝试了许多不同的方法,但都没有奏效。所以我觉得最好是寻求帮助
你的问题是你没有创建一个拷贝。
img2 = img
创建对同一对象的另一个引用,而不是一个新的、单独的图像。在要创建实际副本,请使用^{} method :
接下来,我不使用循环和
getpixel()
/putpixel()
组合。您正在为多次出现的RGB值执行双重工作。如果您使用image.point()
方法,那么您就可以对图像中每个带中的每个唯一值使用公式,并将所有像素的循环留给库(速度更快)。它还可以为您复制图像!在您需要创建一个表;对于R、G和B值的0到255值,计算可能的结果,并将这些3*256结果放入一个长列表中:
^{pr2}$生成的表格用于图像中的每个唯一颜色值。在
您也可以将RGB图像分割为单独的带区,将不同的系数公式作为函数应用于每个单独的带区,然后将这些带区重新组合为新图像:
当创建一个图像过滤器时,您确实希望将输入图像作为函数参数传递给,而不是使用全局变量。同时将系数传递给:
如果需要,可以将调用的结果存储在全局中,但该函数现在可以独立存在,并且可以在任何具有RGB-PIL-image对象的地方重用。使用滑块值调用函数:
在你的个人资料图片上使用上面的
系数为0.75时,得出:
而-0.75导致:
相关问题 更多 >
编程相关推荐