Как вставить картинку в python
Перейти к содержимому

Как вставить картинку в python

  • автор:

Вставить картинку в Label

Пытаюсь вставить в Label картинку, но выдает ошибку Image «. » does not exist , путь точно верный.

from tkinter import * tk = Tk() img = PhotoImage("C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg") b = Label(image = img) b.img = "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg" b.pack() tk.mainloop() 

Искал, да так и не нашел, в чем проблема. Пробовал писать im = Image.open(path_to_file) и соответственно img = PhotoImage(im) , но выдает ошибку.

Отслеживать

49k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков

задан 27 мая 2020 в 22:35

Werflame Xij Werflame Xij

81 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков

Используем Python Pillow для вставки текста и изображения в картинку

Вставка текста и изображения в картинку с Python Pillow (PIL)

Pillow это одна из самых популярных библиотек Python для работы с изображениями. Ранее эта библиотека называлась PIL и последний ее релиз был в 2009, после чего разработчики продолжили ее развитие под названием Pillow. В этой статье будет рассмотрен пример вставки текста и изображения в новую или существующую картинку.

Pillow устанавливается отдельно:

pip install Pillow

Навигация по посту

  • Создание и открытие изображения
  • Добавление текста к изображению
  • Вставка изображения
  • Определение высоты и ширины

Создание и открытие изображения

Для открытия и создания изображения используется модуль Image. На следующем примере мы откроем существующее изображение:

from PIL import Image im = Image.open('d:/beach.jpeg') # Откроет изображение в новом окне im.show()

В следующем примере мы создадим изображение, где мы должны указать:

  • Цветовую модель. Например RGB,RGBA,CMYK,HCL и т.д.;
  • Размер изображения в кортеже;
  • По умолчанию изображение создается с черным фоном. Для его изменения нужно заполнить атрибут color.
from PIL import Image im = Image.new('RGB', (200,200), color=('#FAACAC')) # Откроет изображение в новом окне im.show()

Сохранить изображение можно через save:

from PIL import Image im = Image.new('RGB', (200,200), color=('#FAACAC')) im.save('D:/new_pic.jpg')

Вам так же будет интересно:

Модуль Python os — примеры создания и работы с папками и путями

Добавление текста к изображению

Для изменения изображение используется класс ImageDraw. В следующем примере мы создадим объект этого класса с текстом, где нужно указать:

  • Расположение текста. В примере ниже это (100, 100);
  • Сам текст;
  • Цвет текста.
from PIL import Image, ImageDraw im = Image.new('RGB', (200,200), color=('#FAACAC')) draw_text = ImageDraw.Draw(im) draw_text.text( (100,100), 'Test Text', fill=('#1C0606') ) im.show()

Если использовать кириллические символы, может появится ошибка:

  • AttributeError: ‘ImageFont’ object has no attribute ‘getmask2’
  • UnicodeEncodeError: ‘latin-1’ codec can’t encode characters

Для исправления ошибки вы можете использовать свой шрифт через класс ImageFont. Вы так же сможете указать размер шрифта:

from PIL import Image, ImageDraw, ImageFont im = Image.new('RGB', (200,200), color=('#FAACAC')) # Создаем объект со шрифтом font = ImageFont.truetype('D:/Roboto/Roboto-Black.ttf', size=18) draw_text = ImageDraw.Draw(im) draw_text.text( (100, 100), 'Текст 18px', # Добавляем шрифт к изображению font=font, fill='#1C0606') im.show()

Вставка изображения

Для создания водяного знака, например, откройте второе изображение и используйте функцию paste. При этом первый параметр с watermark будет использовать всю область изображения, а второй установит прозрачность (альфа-канал):

from PIL import Image im = Image.open('d:/beach.jpeg') # Изображение для водяного знака watermark = Image.open('d:/logo.png') im.paste(watermark, (25,25), watermark) im.show()

Определение высоты и ширины

Если вы планируете открывать множество изображений, разных размеров и добавлять текст, например в правый нижний угол вы можете вычислить это местоположение. Объекты Image содержат размеры:

# Ширина и высота im.size # Ширина im.width # Высота im.height

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

from PIL import Image im = Image.open('d:/beach.jpeg') watermark = Image.open('d:/logo.png') # Вычисляем расположение watermark position = (im.width - watermark.width, im.height - watermark.height) im.paste(watermark, position, watermark) im.show()

Работа с изображениями

Для того чтобы использовать картинки в вашей программе вам надо сделать следующее:

  1. Загрузить/найти нужный файл в формате png
  2. Положить его в ту же папку где находится файл с кодом вашей программы ( .py )
  3. В программе написать следующую строчку

image = pygame.image.load('file.png').convert_alpha() 

image будет переменной с нашим изображением.

Как и любую переменную, картинку нужно загружать перед игровым циклом ( while running: ). Если вы используете несколько картинок, даже для одного предмета (например разные направления) загружайте их все один раз в начале программы и используйте в зависимости от ситуации.

Вывод на экран

screen.blit(image, (x, y)) 

Изображение нарисуется левым верхним углом в точке (x, y) .

Изменение размера

Часто оказывается что картинка которую мы загрузили имеет большое разрешение, а значит и размер на экране. Вместо того чтобы исправлять это вручную в графическом редакторе используйте

new_image = pygame.transform.scale(image, (width, height)) 

new_image будет вашей картинкой измененной до размеров width и height .

Поворот

new_image = pygame.transform.rotate(image, angle) 

повернет изображение image на angle градусов.

Внимание

Нельзя поворачивать уже повернутую картинку. Это связанно с тем что повернутое изображение занимает больший прямоуглоьник чем старое, а значит его поворот будет искажаться. Нельзя вместо

image = pygame.transform.rotate(image, 5) 
image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) image = pygame.transform.rotate(image, 1) 

Аналогично, если вы хотите чтобы картинка поворачивалась на 1 градус каждый кадр, нельзя писать

while running: . image = pygame.transform.rotate(image, 1) 

Вместо этого нужно исходную картинку всегда хранить без изменений, а повернутую получать каждый кадр заново.

angle = 0 while running: . angle = angle + 1 rotated_image = pygame.transform.rotate(image, angle) 

Python. Работа с изображениями в tkinter.

На уроке Python. Работа с изображениями мы с вами научились загружать и отображать картинки, а также всяко извращаться с ними. Это мы делали при помощи библиотеки PIL. На уроке Python. GUI мы с вами при помощи библиотеки tkinter создавали виндовый интерфейс программы: всякие кнопочки, флажки, и прочие элементы управления. Но возникает вопрос: а нельзя ли при помощи tkinter как-то выводить изображение на виндовую форму? Можно. Например вот такая программа:

import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = Image.open("d:/3/Dscn0116.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw',image=photo) canvas.grid(row=2,column=1) root.mainloop()

выдаст вот такое окно:

Что интересно, PIL здесь нужен, чтобы загружать изображения типа jpg, gif-ы и png можно открыть и без него:

import tkinter root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) img = tkinter.PhotoImage(file = 'd:/3/Dscn0116.png') image = canvas.create_image(0, 0, anchor='nw',image=img) canvas.grid(row=2,column=1) root.mainloop()

А теперь попробуем при нажатии на кнопку сменить изображение:

import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() # Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1, column=1) image = Image.open("d://1//DSCN1128.png") photo = ImageTk.PhotoImage(image) def my_event_handler(): print("my_event_handler") image = Image.open("d://1//original.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка", command=my_event_handler).grid(row=1, column=2) # Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) root.mainloop()

Но не тут то было. При нажатии на кнопку изображение не меняется. Хотя, казалось бы, все написано правильно, и наш обработчик событий работает, наше сообщение, что мы выводим командой print выводится в окно сообщений. В чем же дело? А дело в сборщике мусора (garbage collector). Как только мы вышли из my_event_handler, локальные переменные тут же уничтожаются сборщиком мусора. Именно поэтому мы видим на форме ту же самую картинку, что и до нажатия на кнопку. Как же быть? Не использовать локальные переменные. Давайте объявим класс, пусть изображение и прочие объекты хранятся в его полях:

import tkinter from PIL import Image, ImageTk class App: def __init__(self): self.root = tkinter.Tk() # создаем рабочую область self.frame = tkinter.Frame(self.root) self.frame.grid() # Добавим метку self.label = tkinter.Label(self.frame, text="Hello, World!").grid(row=1, column=1) self.image = Image.open("d://1//DSCN1128.png") self.photo = ImageTk.PhotoImage(self.image) # вставляем кнопку self.but = tkinter.Button(self.frame, text="Кнопка", command=self.my_event_handler).grid(row=1, column=2) # Добавим изображение self.canvas = tkinter.Canvas(self.root, height=600, width=700) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) self.root.mainloop() def my_event_handler(self): print("my_event_handler") self.image = Image.open("d://1//original.jpg") self.photo = ImageTk.PhotoImage(self.image) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) app= App()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *