Главная » 2025 » Декабрь » 03 » Преобразование объекта UImageGray в объект другого класса
23:04
Преобразование объекта UImageGray в объект другого класса

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

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