Преобразование объекта UImageGray в объект другого класса
В любой момент времени можно преобразовать объект UImageGray в объект другого класса изображения или в объект матрицы. Кроме того, можно преобразовать объект UImageGray:
- в объект
Image из библиотеки PIL;
- в объект
PhotoImage из библиотеки Tkinter (см. описание класса UHelperTk);
- в массив NumPy (см. описание класса
UHelperNP);
- в массив байтов.
Преобразование объекта UImageRGB в объект UImageGray и наоборот
Преобразовать объект UImageRGB в объект UImageGray позволяет метод get_uimagegray() из класса UImageRGB. В случае ошибки метод вернет значение None. Вычисление выполняется по следующей формуле:
value = int(round(r * 0.298912 + g * 0.586611 + b * 0.114478))
Пример:
from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor
img = UImageRGB(3, 2, UColor(255, 0, 0))
img2 = img.get_uimagegray()
print(img2) # UImageGray(width=3, height=2)
print(img2.arr) # [76, 76, 76, 76, 76, 76]
Создать объект UImageRGB на основе объекта UImageGray позволяет статический метод from_uimagegray() из класса UImageRGB. Формат метода:
UImageRGB.from_uimagegray(<UImageGray>)
В параметре указывается объект UImageGray. Если операция выполнена успешно, то метод вернет объект UImageRGB, а в противном случае — значение None. Пример:
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 76)
img2 = UImageRGB.from_uimagegray(img)
print(img2) # UImageRGB(width=3, height=2)
print(img2.arr)
# [76, 76, 76, 76, 76, 76, 76, 76, 76,
# 76, 76, 76, 76, 76, 76, 76, 76, 76]
Преобразование объекта UImageGray в объект UMat и наоборот
Стандартные классы изображений позволяют работать только с целочисленными значениями. Для значений другого типа предназначен класс UMat. Например, можно преобразовать объект изображения в матрицу с вещественными значениями, выполнить какие-либо операции, а затем обратно преобразовать матрицу в объект изображения.
Преобразовать объект UImageGray в объект UMat с вещественными значениями от 0.0 до 1.0 позволяет метод get_umat_64f(). Если операция выполнена успешно, то метод вернет объект UMat, а в случае ошибки — значение None.
Выполнить обратную операцию можно с помощью статического метода from_umat_64f(<UMat>) из класса UImageGray. Матрица должна содержать 1 канал и иметь тип UMat.Type_64F. Если операция выполнена успешно, то метод вернет объект UImageGray, а в случае ошибки — значение None.
Пример преобразования:
from unicross_image.uimagegray import UImageGray
img = UImageGray(2, 2, 255)
print(img.arr)
# [255, 255, 255, 255]
m = img.get_umat_64f()
print(m.arr)
# [1.0, 1.0, 1.0, 1.0]
img = UImageGray.from_umat_64f(m)
print(img) # UImageGray(width=2, height=2)
print(img.arr)
# [255, 255, 255, 255]
Преобразование объекта UImageGray в объект Image из PIL (PILLOW) и наоборот
Графическая библиотека UImage тесно связана с библиотекой PIL (PILLOW). Загрузка изображений из файлов стандартных форматов, сохранение в файл, а также выполнение различных преобразований в основном выполняется средствами библиотеки PIL. Эти операции можно выполнить и с помощью библиотеки ImageMagick, но вот рисование и вывод текста возможны только при условии доступности библиотеки PIL. В любой момент времени имеется возможность преобразования объектов из разных библиотек.
Преобразовать объект UImageGray в объект Image из библиотеки PIL позволяет метод get_pil_image(). Если операция выполнена успешно, то метод вернет объект Image, а в случае ошибки — значение None. Пример:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 255)
print(img) # UImageGray(width=3, height=2)
img2 = img.get_pil_image()
print(img2.size) # (3, 2)
print(img2.mode) # L
Выполнить обратную операцию можно с помощью статического метода from_pil_image(<Image>) из класса UImageGray. Если операция выполнена успешно, то метод вернет объект UImageGray, а в случае ошибки — значение None. Перед операцией при необходимости производится преобразование изображения в режим L средствами библиотеки PIL. Пример преобразования:
from PIL import Image
from unicross_image.uimagegray import UImageGray
img = Image.open("foto.jpg")
print(img.size) # (500, 333)
print(img.mode) # RGB
img2 = UImageGray.from_pil_image(img)
print(img2) # UImageGray(width=500, height=333)
Преобразование объекта UImageGray в массив байтов и наоборот
Для преобразования списка с изображением в массив байтов можно воспользоваться стандартной функцией bytes(). Следует учитывать, что функция сгенерирует исключение, если хотя бы одно значение списка находится вне диапазона от 0 до 255. Пример:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 128)
b = bytes(img.arr)
print(len(b)) # 6
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)
# [128, 128, 128, 128, 128, 128]
С помощью метода get_data_ppm_p6() можно преобразовать объект UImageGray в массив байтов в бинарном формате PPM P6. Перед операцией производится преобразование изображения в формат RGB. Пример преобразования, сохранения в файл и загрузки из файла:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 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 = UImageGray.load("test.ppm")
print(img2) # UImageGray(width=3, height=2)
print(img2.arr)
# [128, 128, 128, 128, 128, 128]
Отобразим изображение в компоненте Canvas:
from unicross_image.uimagegray import UImageGray
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 = UImageGray(500, 300, 128)
# Преобразование в массив байтов
b = img.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()
С помощью метода get_data_pgm_p5() можно преобразовать объект UImageGray в массив байтов в бинарном формате PGM P5. Пример преобразования, сохранения в файл и загрузки из файла:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2, 128)
b = img.get_data_pgm_p5()
print(len(b)) # 17
print(type(b)) # <class 'bytes'>
# Сохранение в файл
with open("test.pgm", "wb") as f:
f.write(b)
# Загрузка из файла
img2 = UImageGray.load("test.pgm")
print(img2) # UImageGray(width=3, height=2)
print(img2.arr)
# [128, 128, 128, 128, 128, 128]
Преобразование объекта UImageGray в объект UMask и наоборот
Преобразовать объект UImageGray в объект UMask позволяет метод get_umask(threshold=127) из класса UImageGray. Все значения меньшие или равные threshold будут преобразованы в False (фон). Все значения больше threshold будут преобразованы в True (часть объекта), В случае ошибки метод вернет значение None. Пример:
from unicross_image.uimagegray import UImageGray
img = UImageGray(3, 2)
img.arr = [0, 64, 127, 128, 180, 255]
mask = img.get_umask(127)
print(mask) # UMask(width=3, height=2, x=0, y=0)
print(mask.arr)
# [False, False, False, True, True, True]
Создать объект UImageGray на основе объекта UMask позволяет статический метод from_umask() из класса UImageGray. Формат метода:
UImageGray.from_umask(<UMask>, invert=False)
В первом параметре указывается объект UMask. Если параметр invert не задан или имеет значение False, то все значения False будут преобразованы в 0, а все значения True — в 255. Если операция выполнена успешно, то метод вернет объект UImageGray, а в противном случае — значение None. Пример:
from unicross_image.uimagegray import UImageGray, UMask
mask = UMask(3, 2)
mask.arr = [False, False, False, True, True, True]
img = UImageGray.from_umask(mask)
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [0, 0, 0, 255, 255, 255]
Если параметр invert имеет значение True, то все значения False будут преобразованы в 255, а все значения True — в 0. Пример:
from unicross_image.uimagegray import UImageGray, UMask
mask = UMask(3, 2)
mask.arr = [False, False, False, True, True, True]
img = UImageGray.from_umask(mask, invert=True)
print(img) # UImageGray(width=3, height=2)
print(img.arr) # [255, 255, 255, 0, 0, 0]
Выполнение манипуляций с объектом UImageGray
Выполнить основные манипуляции с объектом UImageGray позволяет класс UImageGrayChange. С помощью статических методов из этого класса можно:
- создать скриншот экрана;
- повернуть изображение на угол кратный 90 градусов и на произвольный угол;
- отразить изображение по вертикали или горизонтали;
- изменить размер изображения;
- обрезать изображение;
- вставить одно изображение в другое;
- закрасить прямоугольную область;
- размыть изображение или повысить его резкость;
- изменить яркость изображения;
- применить различные фильтры;
- найти границы объектов на изображении;
- удалить лишнюю одноцветную рамку.
Повернем изображение на 90 градусов против часовой стрелки:
from unicross_image.uimagegray import UImageGray
from unicross_image.uimagegraychange import UImageGrayChange
img = UImageGray.load("foto.jpg")
print(img) # UImageGray(width=500, height=333)
img2 = UImageGrayChange.rotate_90(img)
print(img2) # UImageGray(width=333, height=500)
С помощью класса UImageGrayDrawPIL можно что-либо нарисовать на объекте UImageGray. Нарисуем серый круг с черной обводкой:
from unicross_image.uimagegray import UImageGray
from unicross_image.uimagedraw import UImageGrayDrawPIL
img = UImageGray(500, 300, 255)
# Создание контекста рисования
draw = UImageGrayDrawPIL(img)
# Цвет заливки
draw.set_fill(128)
# Цвет обводки
draw.set_stroke(0)
# Рисуем круг
x, y, radius = 250, 150, 100
draw.circle(x, y, radius, width_line=3)
# Получаем обратно изображение
img = draw.get_uimagegray()
img.save("test.png")
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage