Главная » 2025 » Декабрь » 01 » Преобразование объекта UImageRGB в объект другого класса
21:08
Преобразование объекта UImageRGB в объект другого класса

Преобразование объекта UImageRGB в объект другого класса

В любой момент времени можно преобразовать объект UImageRGB в объект другого класса изображения или в объект матрицы. Кроме того, можно преобразовать объект UImageRGB:

  • в объект Image из библиотеки PIL;
  • в объект PhotoImage из библиотеки Tkinter (см. описание класса UHelperTk);
  • в массив NumPy (см. описание класса UHelperNP);
  • в массив байтов.

Преобразование объекта UImageRGB в объект UImage и наоборот

Преобразовать объект UImage в объект UImageRGB позволяет метод get_uimagergb(bgcolor=None) из класса UImage. Если параметр 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. Формат метода:

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]

Преобразование объекта UImageRGB в объект UImageGray и наоборот

Преобразовать объект UImageRGB в объект UImageGray позволяет метод get_uimagegray(). В случае ошибки метод вернет значение 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.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]

Преобразование объекта UImageRGB в объект UMat и наоборот

Стандартные классы изображений позволяют работать только с целочисленными значениями. Для значений другого типа предназначен класс UMat. Например, можно преобразовать объект изображения в матрицу с вещественными значениями, выполнить какие-либо операции, а затем обратно преобразовать матрицу в объект изображения.

Преобразовать объект UImageRGB в объект UMat с вещественными значениями от 0.0 до 1.0 позволяет метод get_umat_64f(). Если операция выполнена успешно, то метод вернет объект UMat, а в случае ошибки — значение None.

Выполнить обратную операцию можно с помощью статического метода from_umat_64f(<UMat>) из класса UImageRGB. Матрица должна содержать 3 канала и иметь тип UMat.Type_64F. Если операция выполнена успешно, то метод вернет объект UImageRGB, а в случае ошибки — значение None.

Пример преобразования:

from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor

img = UImageRGB(2, 2, UColor(255, 0, 0))
print(img.arr)
# [255, 0, 0,   255, 0, 0,
#  255, 0, 0,   255, 0, 0]
m = img.get_umat_64f()
print(m.arr)
# [1.0, 0.0, 0.0,   1.0, 0.0, 0.0,
#  1.0, 0.0, 0.0,   1.0, 0.0, 0.0]
img = UImageRGB.from_umat_64f(m)
print(img)      # UImageRGB(width=2, height=2)
print(img.arr)
# [255, 0, 0,   255, 0, 0,
#  255, 0, 0,   255, 0, 0]

Преобразование объекта UImageRGB в объект Image из PIL (PILLOW) и наоборот

Графическая библиотека UImage тесно связана с библиотекой PIL (PILLOW). Загрузка изображений из файлов стандартных форматов, сохранение в файл, а также выполнение различных преобразований в основном выполняется средствами библиотеки PIL. Эти операции можно выполнить и с помощью библиотеки ImageMagick, но вот рисование и вывод текста возможны только при условии доступности библиотеки PIL. В любой момент времени имеется возможность преобразования объектов из разных библиотек.

Преобразовать объект UImageRGB в объект Image из библиотеки PIL позволяет метод get_pil_image(). Если операция выполнена успешно, то метод вернет объект Image, а в случае ошибки — значение None. Пример:

from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor

img = UImageRGB(3, 2, UColor(255, 0, 0))
print(img)                  # UImageRGB(width=3, height=2)
img2 = img.get_pil_image()
print(img2.size)            # (3, 2)
print(img2.mode)            # RGB

Выполнить обратную операцию можно с помощью статического метода from_pil_image(<Image>) из класса UImageRGB. Если операция выполнена успешно, то метод вернет объект UImageRGB, а в случае ошибки — значение None. Пример преобразования:

from PIL import Image
from unicross_image.uimagergb import UImageRGB

img = Image.open("foto.jpg")
print(img.size)        # (500, 333)
print(img.mode)        # RGB
img2 = UImageRGB.from_pil_image(img)
print(img2)            # UImageRGB(width=500, height=333)

Преобразование объекта UImageRGB в массив байтов и наоборот

Для преобразования списка с изображением в массив байтов можно воспользоваться стандартной функцией bytes(). Следует учитывать, что функция сгенерирует исключение, если хотя бы одно значение списка находится вне диапазона от 0 до 255. Пример:

from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor

img = UImageRGB(3, 2, UColor(255, 0, 0))
b = bytes(img.arr)
print(len(b))  # 18
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,   255, 0, 0,   255, 0, 0,
#  255, 0, 0,   255, 0, 0,   255, 0, 0]

С помощью метода get_data_ppm_p6() можно преобразовать объект UImageRGB в массив байтов в бинарном формате PPM P6. Пример преобразования, сохранения в файл и загрузки из файла:

from unicross_image.uimagergb import UImageRGB
from unicross_image.ucolor import UColor

img = UImageRGB(3, 2, UColor(255, 0, 0))
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 = UImageRGB.load("test.ppm")
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]

Отобразим изображение в компоненте Canvas:

from unicross_image.uimagergb import UImageRGB
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 = UImageRGB(500, 300, UColor(255, 0, 0))
# Преобразование в массив байтов
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()

Выполнение манипуляций с объектом UImageRGB

Выполнить основные манипуляции с объектом UImageRGB позволяет класс UImageRGBChange. С помощью статических методов из этого класса можно:

  • создать скриншот экрана;
  • повернуть изображение на угол кратный 90 градусов и на произвольный угол;
  • отразить изображение по вертикали или горизонтали;
  • изменить размер изображения;
  • обрезать изображение;
  • вставить одно изображение в другое с учетом альфа-канала;
  • закрасить прямоугольную область цветом;
  • разделить изображение на каналы и собрать из каналов;
  • размыть изображение или повысить его резкость;
  • изменить контраст или яркость изображения;
  • преобразовать в изображение в оттенках серого;
  • применить различные фильтры;
  • найти границы объектов на изображении;
  • добавить рамку или удалить лишнюю одноцветную рамку.

Повернем изображение на 90 градусов против часовой стрелки:

from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagergbchange import UImageRGBChange

img = UImageRGB.load("foto.jpg")
print(img) # UImageRGB(width=500, height=333)
img2 = UImageRGBChange.rotate_90(img)
print(img2) # UImageRGB(width=333, height=500)

С помощью класса UImageRGBDrawPIL можно что-либо нарисовать на объекте UImageRGB. Нарисуем желтый круг с красной обводкой:

from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL

img = UImageRGB(500, 300, UColor("white"))
# Создание контекста рисования
draw = UImageRGBDrawPIL(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_uimagergb()
img.save("test.png")

Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage

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