В старших классах мы начинаем с 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
и h
загружаются с шириной и высотой изображения.
Еще одно глобальное изображение объекта img2
создано для выходного изображения и является копией img
.
Тогда вот функция, которая обрабатывает изображение
def filtreTC(): #Filtre permettant de changer la température de couleur
coef = sliderTC.get() / 100 #On récupère le coefficient à partir de l'échelle. Le coefficient compris entre -1 et 1: -1 = froid (image bleu-vert), 0 = neutre, 1 = chaud (image orangée)
fenTC.destroy() #On ferme la fenêtre
if(coef <= 0): #Calcul des coefficients rouges, verte et bleus
coefR = 1 + coef
coefV = 1 + (coef / 2)
coefB = 1
else:
coefR = 1
coefV = 1 - (coef / 2)
coefB = 1 - coef
for y in range(0, h, 1):
for x in range(0, l, 1):
r, v, b = img.getpixel((x, y))
r = int(float(r * coefR))
v = int(float(v * coefV))
b = int(float(b * coefB))
img2.putpixel((x, y), (r, v, b))
img2.show()
Это цикл, который просматривает все изображение и берет пиксель из 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, и они никогда не выходили за границы, поэтому я не понимаю, что это за ошибка.
Я потратил несколько часов, чтобы попытаться выяснить, в чем проблема, и перепробовал много разных вещей, но ни одна из них не сработала. Поэтому я подумал, что лучше обратиться за помощью