Python версии 3.10 генерирует ошибку при попытке добавить водяной знак к изображению

Примечание: все версии 3.9 отлично выполняют код, создавая изображение с водяным знаком.

Я создал этот проект, чтобы разместить крест водяного знака, который идеально соответствует размеру изображения, но в этой строке кода:

paste_mask = watermark.split()[3].point(lambda i: i * TRANSPARENCY / 100.)

Он генерирует эту ошибку:

File "c:\Users\Computador\Desktop\Python\Watermark.py", line 29, in watermark_with_transparency
paste_mask = watermark.split()[3].point(lambda i: i * TRANSPARENCY / 100.)
File "C:\Users\Computador\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\Image.py", line 1723, in point
return self._new(self.im.point(lut, mode))
TypeError: 'float' object cannot be interpreted as an integer

Полный код:

from PIL import Image

def watermark_with_transparency(input_image_path,
                                output_image_path,
                                watermark_image_path):
    TRANSPARENCY = 10
    angle = 30
    base_image = Image.open(input_image_path)
    w_img, h_img = base_image.size
    basewidth = w_img
    watermark = Image.open(watermark_image_path)
    watermark = watermark.rotate(angle, expand=True)
    wpercent = (basewidth / float(watermark.size[0]))
    hpercent = h_img / float(watermark.size[1])
    if wpercent < hpercent:
        hsize = int((float(watermark.size[1]) * float(wpercent)))
        watermark = watermark.resize((basewidth, hsize), Image.ANTIALIAS)
    else:
        wsize = int((float(watermark.size[0]) * float(hpercent)))
        watermark = watermark.resize((wsize, h_img), Image.ANTIALIAS)
    w_logo, h_logo = watermark.size
    center_y = int(h_img / 2)
    center_x = int(w_img / 2)
    top_y = center_y - int(h_logo / 2)
    left_x = center_x - int(w_logo / 2)
    if watermark.mode != 'RGBA':
        alpha = Image.new('L', (w_img, h_img), 255)
        watermark.putalpha(alpha)
    paste_mask = watermark.split()[3].point(lambda i: i * TRANSPARENCY / 100.)
    base_image.paste(watermark, (left_x, top_y), mask=paste_mask)
    base_image.save(output_image_path)

Модель на изображении в порядке, и значения, на мой взгляд, верны, что мне нужно изменить, чтобы работать в этой новой версии Python?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться:

paste_mask = watermark.split()[3].point(lambda i: int(i * TRANSPARENCY / 100.))

Кажется, что при переходе к Python 3.9type inference изменилось, и значения не были автоматически преобразованы в int.

Прежде всего, спасибо за внимание, но когда я пытаюсь, ошибка остается.

Brondby IF 12.05.2022 16:25

точка, кажется, ожидает int. попробуй

YScharf 12.05.2022 16:30

Это сработало отлично @YScharf, в соответствии с передовым опытом stackoverflow, было бы интересно, если бы вы добавили объяснение, даже если оно минимально из того, что изменилось с 3.9 на 3.10, вызвавшее эту ошибку, чтобы будущие люди и я могли понять, что изменилось. Если сможешь и тебя это не побеспокоит, конечно!

Brondby IF 12.05.2022 16:57

Другие вопросы по теме