Главная » 2025 » Ноябрь » 30 » Преобразование объекта UImage в объект другого класса
20:06
Преобразование объекта UImage в объект другого класса

Преобразование объекта 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

Категория: UImage | Просмотров: 2 | Добавил: unicross | Теги: UImage, Python, PIL, ImageMagick | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Списки слов [10]
Списки слов и словари
OCR [4]
Оптическое распознавание символов
UImage [18]
Графическая библиотека для Python
Программы [4]
Полезные программы
Прочее [3]
Другие темы
Календарь
«  Ноябрь 2025  »
Пн Вт Ср Чт Пт Сб Вс
     12
3456789
10111213141516
17181920212223
24252627282930
Архив записей