2017-02-04 4 views
0

У меня есть программа здесь, что я поймал вопрос здесь о переполнении стека. Он должен регулировать Контраст изображения, но я получаю следующее сообщение об ошибке:«ТипError: целочисленный аргумент, ожидаемый, полученный float» в PIL

Traceback (most recent call last): 
    File "<string>", line 420, in run_nodebug 
    File "<module1>", line 20, in <module> 
    File "<module1>", line 16, in change_contrast 
    File "C:\EduPython\App\lib\site-packages\PIL\Image.py", line 1512, in putpixel 
    return self.im.putpixel(xy, value) 
TypeError: integer argument expected, got float 

Пост довольно старый, так что я не думаю, что человек, который написал это увидит мою просьбу, поэтому я отправляю Вот. Вот код:

from PIL import Image 

def change_contrast(img, level): 
    def truncate(v): 
     return 0 if v < 0 else 255 if v > 255 else v 


    img = Image.open("C:\\Users\\omar\\Desktop\\Site\\Images\\obama.png") 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      new_color = tuple(truncate(factor * (c-128) + 128) for c in color) 
      img.putpixel((x, y), new_color) 

    return img 

result = change_contrast('test_image1.jpg', 128) 
result.save('test_image1_output.jpg') 
print('done') 

ответ

1

Хм, что truncate?

Попробуйте сказать int, где вы говорите truncate.

+0

truncate определяется в начале после 'def change_contrast (img, level)' как 'def truncate (v)' –

+0

factor - это float, поэтому new_color завершается, будучи кортежем поплавков. putpixel хочет кортеж ints. –

+0

Вам нужно убедиться, что new_color является кортежем ints, а не кортежем поплавков. Измените truncate, чтобы он возвращал int ... или добавлял int() вокруг вызова для truncate(). –

Смежные вопросы