Преобразование объекта UImage в объект другого класса
В любой момент времени можно преобразовать объект UImage в объект другого класса изображения или в объект матрицы. Кроме того, можно преобразовать объект UImage:
- в объект
Image из библиотеки PIL;
- в объект
PhotoImage из библиотеки Tkinter (с потерей альфа-канала; см. описание класса UHelperTk);
- в массив NumPy (см. описание класса
UHelperNP);
- в массив байтов.
Преобразование объекта UImage в объект UImageRGB и наоборот
Преобразовать объект UImage в объект UImageRGB позволяет метод get_uimagergb(bgcolor=None). Если параметр bgcolor не задан, то альфа-канал при выполнении операции просто отбрасывается. В случае ошибки метод вернет значение None. Пример:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
img2 = img.get_uimagergb()
print(img2) # UImageRGB(width=3, height=2)
print(img2.arr)
# [255, 0, 0, 255, 0, 0, 255, 0, 0,
# 255, 0, 0, 255, 0, 0, 255, 0, 0]
Если нужно учесть значения из альфа-канала, то можно выполнить наложение на цветную непрозрачную основу. Для этого в параметре bgcolor указывается непрозрачный цвет основы в виде объекта UColor (альфа-канал объекта цвета игнорируется). Операция выполняется с помощью библиотеки PIL. Если библиотека PIL недоступна, то производится попытка выполнить операцию с помощью библиотеки ImageMagick. Если библиотека ImageMagick недоступна, то альфа-канал просто отбрасывается. Если возникла ошибка, то метод вернет значение None. Пример наложения на белую основу:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
img2 = img.get_uimagergb(UColor("white"))
print(img2) # UImageRGB(width=3, height=2)
print(img2.arr)
# [255, 127, 127, 255, 127, 127, 255, 127, 127,
# 255, 127, 127, 255, 127, 127, 255, 127, 127]
Создать объект UImage на основе объекта UImageRGB позволяет статический метод from_uimagergb(). Формат метода:
UImage.from_uimagergb(<UImageRGB>, opacity=255)
В первом параметре указывается объект UImageRGB. Параметр opacity позволяет задать значение для альфа-канала. Если операция выполнена успешно, то метод вернет объект UImage, а в противном случае — значение None. Пример:
from unicross_image.uimage import UImage
from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor
img = UImageRGB(3, 2, UColor(255, 0, 0))
img2 = UImage.from_uimagergb(img, opacity=128)
print(img2) # UImage(width=3, height=2)
print(img2.arr)
# [255, 0, 0, 128, 255, 0, 0, 128, 255, 0, 0, 128,
# 255, 0, 0, 128, 255, 0, 0, 128, 255, 0, 0, 128]
Преобразование объекта UImage в объект UImageGray и наоборот
Преобразовать объект UImage в объект UImageGray позволяет метод get_uimagegray(). Альфа-канал при выполнении операции просто отбрасывается. В случае ошибки метод вернет значение None. Вычисление выполняется по следующей формуле:
value = int(round(r * 0.298912 + g * 0.586611 + b * 0.114478))
Пример:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
img2 = img.get_uimagegray()
print(img2) # UImageGray(width=3, height=2)
print(img2.arr) # [76, 76, 76, 76, 76, 76]
Создать объект UImage на основе объекта UImageGray позволяет статический метод from_uimagegray(). Формат метода:
UImage.from_uimagegray(<UImageGray>, opacity=255)
В первом параметре указывается объект UImageGray. Параметр opacity позволяет задать значение для альфа-канала. Если операция выполнена успешно, то метод вернет объект UImage, а в противном случае — значение None. Пример:
from unicross_image.uimage import UImage
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 76)
img2 = UImage.from_uimagegray(img, opacity=128)
print(img2) # UImage(width=3, height=2)
print(img2.arr)
# [76, 76, 76, 128, 76, 76, 76, 128, 76, 76, 76, 128,
# 76, 76, 76, 128, 76, 76, 76, 128, 76, 76, 76, 128]
Преобразование объекта UImage в объект UMat и наоборот
Стандартные классы изображений позволяют работать только с целочисленными значениями. Для значений другого типа предназначен класс UMat. Например, можно преобразовать объект изображения в матрицу с вещественными значениями, выполнить какие-либо операции, а затем обратно преобразовать матрицу в объект изображения.
Преобразовать объект UImage в объект UMat с вещественными значениями от 0.0 до 1.0 позволяет метод get_umat_64f(). Если операция выполнена успешно, то метод вернет объект UMat, а в случае ошибки — значение None.
Выполнить обратную операцию можно с помощью статического метода from_umat_64f(<UMat>) из класса UImage. Матрица должна содержать 4 канала и иметь тип UMat.Type_64F. Если операция выполнена успешно, то метод вернет объект UImage, а в случае ошибки — значение None.
Пример преобразования:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(2, 2, UColor(255, 0, 0, 255))
print(img.arr)
# [255, 0, 0, 255, 255, 0, 0, 255,
# 255, 0, 0, 255, 255, 0, 0, 255]
m = img.get_umat_64f()
print(m.arr)
# [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0,
# 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0]
img = UImage.from_umat_64f(m)
print(img) # UImage(width=2, height=2)
print(img.arr)
# [255, 0, 0, 255, 255, 0, 0, 255,
# 255, 0, 0, 255, 255, 0, 0, 255]
Преобразование объекта UImage в объект Image из PIL (PILLOW) и наоборот
Графическая библиотека UImage тесно связана с библиотекой PIL (PILLOW). Загрузка изображений из файлов стандартных форматов, сохранение в файл, а также выполнение различных преобразований в основном выполняется средствами библиотеки PIL. Эти операции можно выполнить и с помощью библиотеки ImageMagick, но вот рисование и вывод текста возможны только при условии доступности библиотеки PIL. В любой момент времени имеется возможность преобразования объектов из разных библиотек.
Преобразовать объект UImage в объект Image из библиотеки PIL позволяет метод get_pil_image(). Если операция выполнена успешно, то метод вернет объект Image, а в случае ошибки — значение None. Пример:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
print(img) # UImage(width=3, height=2)
img2 = img.get_pil_image()
print(img2.size) # (3, 2)
print(img2.mode) # RGBA
Выполнить обратную операцию можно с помощью статического метода from_pil_image(<Image>) из класса UImage. Если операция выполнена успешно, то метод вернет объект UImage, а в случае ошибки — значение None. Пример преобразования:
from PIL import Image
from unicross_image.uimage import UImage
img = Image.open("foto.png")
print(img.size) # (500, 333)
print(img.mode) # RGBA
img2 = UImage.from_pil_image(img)
print(img2) # UImage(width=500, height=333)
Преобразование объекта UImage в массив байтов и наоборот
Для преобразования списка с изображением в массив байтов можно воспользоваться стандартной функцией bytes(). Следует учитывать, что функция сгенерирует исключение, если хотя бы одно значение списка находится вне диапазона от 0 до 255. Пример:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
b = bytes(img.arr)
print(len(b)) # 24
print(type(b)) # <class 'bytes'>
Выполнить обратное преобразование позволяет функция list():
ar = list(b)
img.arr = ar
print(img.is_valid()) # True
print(img.is_normal()) # True
print(img.arr)
# [255, 0, 0, 128, 255, 0, 0, 128, 255, 0, 0, 128,
# 255, 0, 0, 128, 255, 0, 0, 128, 255, 0, 0, 128]
С помощью метода get_data_ppm_p6() можно преобразовать объект UImage в массив байтов в бинарном формате PPM P6. Альфа-канал при выполнении операции отбрасывается. Пример преобразования, сохранения в файл и загрузки из файла::
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
img = UImage(3, 2, UColor(255, 0, 0, 128))
b = img.get_data_ppm_p6()
print(len(b)) # 29
print(type(b)) # <class 'bytes'>
# Сохранение в файл
with open("test.ppm", "wb") as f:
f.write(b)
# Загрузка из файла
img2 = UImage.load("test.ppm")
print(img2) # UImage(width=3, height=2)
print(img2.arr) # Альфа-канал потерян!
# [255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255,
# 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255]
Отобразим полупрозрачное изображение с учетом прозрачности в компоненте Canvas:
from unicross_image.uimage import UImage
from unicross_image.ucolor import UColor
from tkinter import *
root = Tk()
root.title("Метод get_data_ppm_p6()")
root.geometry("700x450")
canvas = Canvas(bg="white", width=600, height=400)
canvas.pack(anchor=CENTER, expand=1)
img = UImage(500, 300, UColor(255, 0, 0, 128))
# Наложение на белую основу и преобразование в массив байтов
b = img.get_uimagergb(UColor("white")).get_data_ppm_p6()
# Преобразование в PhotoImage
img_tk = PhotoImage(data=str(b, "latin1"), format="ppm")
canvas.create_image(10, 10, anchor=NW, image=img_tk)
root.mainloop()
Выполнение манипуляций с объектом UImage
Выполнить основные манипуляции с объектом UImage позволяет класс UImageChange. С помощью статических методов из этого класса можно:
- повернуть изображение на угол кратный 90 градусов и на произвольный угол;
- отразить изображение по вертикали или горизонтали;
- изменить размер изображения;
- обрезать изображение;
- вставить одно изображение в другое с учетом альфа-канала;
- закрасить прямоугольную область цветом;
- разделить изображение на каналы и собрать из каналов;
- размыть изображение или повысить его резкость;
- изменить контраст или яркость изображения;
- преобразовать в изображение в оттенках серого;
- применить различные фильтры;
- найти границы объектов на изображении;
- добавить рамку или удалить лишнюю одноцветную рамку.
Повернем изображение на 90 градусов против часовой стрелки:
from unicross_image.uimage import UImage
from unicross_image.uimagechange import UImageChange
img = UImage.load("foto.png")
print(img) # UImage(width=500, height=333)
img2 = UImageChange.rotate_90(img)
print(img2) # UImage(width=333, height=500)
С помощью класса UImageDrawPIL можно что-либо нарисовать на объекте UImage. Нарисуем желтый круг с красной обводкой:
from unicross_image.ucolor import UColor
from unicross_image.uimage import UImage
from unicross_image.uimagedraw import UImageDrawPIL
img = UImage(500, 300, UColor("white"))
# Создание контекста рисования
draw = UImageDrawPIL(img)
# Цвет заливки
draw.set_fill(UColor("yellow"))
# Цвет обводки
draw.set_stroke(UColor("red"))
# Рисуем круг
x, y, radius = 250, 150, 100
draw.circle(x, y, radius, width_line=3)
# Получаем обратно изображение
img = draw.get_uimage()
img.save("test.png")
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage