Главная » 2026 » Январь » 05 » UImageGray C API: преобразование в объект другого класса
18:46
UImageGray C API: преобразование в объект другого класса

UImageGray C API: преобразование в объект другого класса

В любой момент времени можно преобразовать объект UImageGray в объект другого класса изображения.

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

Преобразовать объект UImageRGB в объект UImageGray позволяет функция uimagegray_from_rgb(). Прототип функции:

int uimagegray_from_rgb(unsigned char* parr_rgb, int arr_len_rgb,
                        unsigned char* parr_gray, int arr_len_gray);

Код описания параметров для Python:

_uimagegray_from_rgb = _ulibc.uimagegray_from_rgb
_uimagegray_from_rgb.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_rgb.restype = ctypes.c_int

Параметр parr_rgb является указателем, ссылающимся  на массив в формате RGB. Размер этого массива задается в параметре arr_len_rgb. Параметр parr_gray является указателем, ссылающимся  на массив в который будет записано изображение в оттенках серого. Размер этого массива задается в параметр arr_len_gray. Вычисление производится по следующей формуле:

v = (int)round(r * 0.298912 + g * 0.586611 + b * 0.114478);

Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_from_rgb = _ulibc.uimagegray_from_rgb
_uimagegray_from_rgb.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_rgb.restype = ctypes.c_int
w, h = 3, 2
arr = [255, 0, 0] * (w * h)
arr_rgb = (ctypes.c_ubyte * len(arr))(*arr)
print(arr_rgb._length_) # 18
arr_g = (ctypes.c_ubyte * (w * h))()
res = _uimagegray_from_rgb(arr_rgb, arr_rgb._length_,
                           arr_g, arr_g._length_)
print(res) # 1
print(arr_g[:])
# [76, 76, 76, 76, 76, 76]

Преобразовать объект UImageGray в объект UImageRGB позволяет функция uimagegray_to_rgb(). Прототип функции:

int uimagegray_to_rgb(unsigned char* parr_gray, int arr_len_gray,
                      unsigned char* parr_rgb, int arr_len_rgb);

Код описания параметров для Python:

_uimagegray_to_rgb = _ulibc.uimagegray_to_rgb
_uimagegray_to_rgb.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_to_rgb.restype = ctypes.c_int

Параметр parr_gray является указателем, ссылающимся  на массив изображения в оттенках серого. Размер этого массива задается в параметре arr_len_gray. Параметр parr_rgb является указателем, ссылающимся  на массив в который будет записано изображение RGB. Размер этого массива задается в параметр arr_len_rgb. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_to_rgb = _ulibc.uimagegray_to_rgb
_uimagegray_to_rgb.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_to_rgb.restype = ctypes.c_int
w, h = 3, 2
arr = [76] * (w * h)
arr_g = (ctypes.c_ubyte * len(arr))(*arr)
print(arr_g._length_)   # 6
arr_rgb = (ctypes.c_ubyte * (w * h * 3))()
print(arr_rgb._length_) # 18
res = _uimagegray_to_rgb(arr_g, arr_g._length_,
                       arr_rgb, arr_rgb._length_)
print(res) # 1
print(arr_rgb[:])
# [76, 76, 76,   76, 76, 76,   76, 76, 76,
#  76, 76, 76,   76, 76, 76,   76, 76, 76]

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

Преобразовать объект UImage в объект UImageGray позволяет функция uimagegray_from_rgba(). Прототип функции:

int uimagegray_from_rgba(unsigned char* parr_rgba, int arr_len_rgba,
                         unsigned char* parr_gray, int arr_len_gray);

Код описания параметров для Python:

_uimagegray_from_rgba = _ulibc.uimagegray_from_rgba
_uimagegray_from_rgba.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_rgba.restype = ctypes.c_int

Параметр parr_rgba является указателем, ссылающимся  на массив в формате RGBA. Размер этого массива задается в параметре arr_len_rgba. Параметр parr_gray является указателем, ссылающимся на массив в который будет записано изображение в оттенках серого. Размер этого массива задается в параметр arr_len_gray. Вычисление производится по следующей формуле:

v = (int)round(r * 0.298912 + g * 0.586611 + b * 0.114478);

Альфа-канал просто отбрасывается. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_from_rgba = _ulibc.uimagegray_from_rgba
_uimagegray_from_rgba.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_rgba.restype = ctypes.c_int
w, h = 3, 2
arr = [255, 0, 0, 255] * (w * h)
arr_rgba = (ctypes.c_ubyte * len(arr))(*arr)
print(arr_rgba._length_) # 24
arr_g = (ctypes.c_ubyte * (w * h))()
res = _uimagegray_from_rgba(arr_rgba, arr_rgba._length_,
                          arr_g, arr_g._length_)
print(res) # 1
print(arr_g[:])
# [76, 76, 76, 76, 76, 76]

Преобразовать объект UImageGray в объект UImage позволяет функция uimagegray_to_rgba(). Прототип функции:

int uimagegray_to_rgba(unsigned char* parr_gray, int arr_len_gray,
                       unsigned char* parr_rgba, int arr_len_rgba);

Код описания параметров для Python:

_uimagegray_to_rgba = _ulibc.uimagegray_to_rgba
_uimagegray_to_rgba.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_to_rgba.restype = ctypes.c_int

Параметр parr_gray является указателем, ссылающимся  на массив изображения в оттенках серого. Размер этого массива задается в параметре arr_len_gray. Параметр parr_rgba является указателем, ссылающимся  на массив в который будет записано изображение RGBA. Размер этого массива задается в параметр arr_len_rgba. Альфа-канал получит значение 255. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_to_rgba = _ulibc.uimagegray_to_rgba
_uimagegray_to_rgba.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_to_rgba.restype = ctypes.c_int
w, h = 3, 2
arr = [76] * (w * h)
arr_g = (ctypes.c_ubyte * len(arr))(*arr)
print(arr_g._length_)    # 6
arr_rgba = (ctypes.c_ubyte * (w * h * 4))()
print(arr_rgba._length_) # 24
res = _uimagegray_to_rgba(arr_g, arr_g._length_,
                          arr_rgba, arr_rgba._length_)
print(res) # 1
print(arr_rgba[:])
# [76, 76, 76, 255,   76, 76, 76, 255,   76, 76, 76, 255,
#  76, 76, 76, 255,   76, 76, 76, 255,   76, 76, 76, 255]

Преобразование объекта UImageGray в черно-белое изображение

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

int uimagegray_bw(int w, int h,
                  unsigned char* parr, int arr_len, int threshold);

Код описания параметров для Python:

_uimagegray_bw = _ulibc.uimagegray_bw
_uimagegray_bw.argtypes = [ctypes.c_int, ctypes.c_int,
      ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int]
_uimagegray_bw.restype = ctypes.c_int

Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся  на массив с пикселями. Размер этого массива задается в параметре arr_len. В качестве параметра threshold указывается число от 0 до 255. Все пиксели со значением меньшим или равным этому числу станут черными, а все остальные пиксели станут белыми. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGEGRAY_TRUE), а в случае ошибки — значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_bw = _ulibc.uimagegray_bw
_uimagegray_bw.argtypes = [ctypes.c_int, ctypes.c_int,
      ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int]
_uimagegray_bw.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
print(arr[:])
# [0, 64, 128, 200, 254, 255]
res = _uimagegray_bw(arr._length_, 1, arr, arr._length_, 254)
print(res) # 1
print(arr[:])
# [0, 0, 0, 0, 0, 255]
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
res = _uimagegray_bw(arr._length_, 1, arr, arr._length_, 128)
print(res) # 1
print(arr[:])
# [0, 0, 0, 255, 255, 255]

Проверить, является ли изображение черно-белым позволяет функция uimagegray_is_bw(). Прототип функции:

int uimagegray_is_bw(unsigned char* parr, int arr_len);

Код описания параметров для Python:

_uimagegray_is_bw = _ulibc.uimagegray_is_bw
_uimagegray_is_bw.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_is_bw.restype = ctypes.c_int

Параметр parr является указателем, ссылающимся  на массив с пикселями. Размер этого массива задается в параметре arr_len. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если в изображении присутствуют только два цвета: 0 (черный) и 255 (белый), и 0 (UIMAGEGRAY_FALSE) — в противном случае. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_is_bw = _ulibc.uimagegray_is_bw
_uimagegray_is_bw.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_is_bw.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(255, 255, 255, 255, 255, 255)
res = _uimagegray_is_bw(arr, arr._length_)
print(res) # 1
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
res = _uimagegray_is_bw(arr, arr._length_)
print(res) # 0

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

Преобразовать объект UImageGray в объект UMask позволяет функция uimagegray_to_umask(). Прототип функции:

int uimagegray_to_umask(unsigned char* parr_int, int arr_len_int,
                 _Bool* parr_bool, int arr_len_bool, int threshold);

Код описания параметров для Python:

_uimagegray_to_umask = _ulibc.uimagegray_to_umask
_uimagegray_to_umask.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_bool), ctypes.c_int, ctypes.c_int]
_uimagegray_to_umask.restype = ctypes.c_int

Параметр parr_int является указателем, ссылающимся  на массив пикселей. Размер этого массива задается в параметре arr_len_int. Параметр parr_bool является указателем, ссылающимся на массив в который будет записано черно-белое изображение. Размер этого массива задается в параметр arr_len_bool. Все значения меньшие или равные threshold будут преобразованы в UIMAGEGRAY_FALSE (фон). Все значения больше threshold будут преобразованы в UIMAGEGRAY_TRUE (часть объекта). Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_to_umask = _ulibc.uimagegray_to_umask
_uimagegray_to_umask.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.POINTER(ctypes.c_bool), ctypes.c_int, ctypes.c_int]
_uimagegray_to_umask.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
arr_b = (ctypes.c_bool * arr._length_)()
res = _uimagegray_to_umask(arr, arr._length_,
                           arr_b, arr_b._length_, 128)
print(res) # 1
print(arr_b[:])
# [False, False, False, True, True, True]
res = _uimagegray_to_umask(arr, arr._length_,
                           arr_b, arr_b._length_, 254)
print(res) # 1
print(arr_b[:])
# [False, False, False, False, False, True]

Создать объект UImageGray на основе объекта UMask позволяет функция umask_to_uimagegray(). Прототип функции:

int umask_to_uimagegray(_Bool* parr_bool, int arr_len_bool,
             unsigned char* parr_int, int arr_len_int, _Bool invert);

Код описания параметров для Python:

_umask_to_uimagegray = _ulibc.umask_to_uimagegray
_umask_to_uimagegray.argtypes = [
   ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_bool]
_umask_to_uimagegray.restype = ctypes.c_int

Параметр parr_bool является указателем, ссылающимся  на массив маски. Размер этого массива задается в параметре arr_len_bool. Параметр parr_int является указателем, ссылающимся на массив в который будет записано изображение в оттенках серого. Размер этого массива задается в параметре arr_len_int. Если параметр invert имеет значение false, то все значения false будут преобразованы в 0, а все значения true — в 255. Если параметр invert имеет значение true, то все значения false будут преобразованы в 255, а все значения true — в 0. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_umask_to_uimagegray = _ulibc.umask_to_uimagegray
_umask_to_uimagegray.argtypes = [
   ctypes.POINTER(ctypes.c_bool), ctypes.c_int,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_bool]
_umask_to_uimagegray.restype = ctypes.c_int
arr = [False, False, False, True, True, True]
arr_b = (ctypes.c_bool * len(arr))(*arr)
print(arr_b[:])
# [False, False, False, True, True, True]
arr_g = (ctypes.c_ubyte * arr_b._length_)()
res = _umask_to_uimagegray(arr_b, arr_b._length_,
                           arr_g, arr_g._length_, False)
print(res) # 1
print(arr_g[:])
# [0, 0, 0, 255, 255, 255]
res = _umask_to_uimagegray(arr_b, arr_b._length_,
                           arr_g, arr_g._length_, True)
print(res) # 1
print(arr_g[:])
# [255, 255, 255, 0, 0, 0]

Преобразование объекта UImageGray в строку в формате BWSTR и наоборот

Строка в формате BWSTR может содержать только два значения:

  • 0 — означает черный цвет (соответствует значению 0);
  • 1 — означает белый цвет (соответствует значению 255).

Строки двумерной матрицы записываются слева направо и сверху вниз.

Преобразовать черно-белое изображение, хранимое в объекте UImageGray, в строку в формате BWSTR позволяет функция uimagegray_to_bwstr(). Прототип функции:

int uimagegray_to_bwstr(unsigned char* parr_int, int arr_len_int,
                        char* s, int s_len);

Код описания параметров для Python:

_uimagegray_to_bwstr = _ulibc.uimagegray_to_bwstr
_uimagegray_to_bwstr.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.c_char_p, ctypes.c_int]
_uimagegray_to_bwstr.restype = ctypes.c_int

Параметр parr_int является указателем, ссылающимся на массив пикселей. Размер этого массива задается в параметре arr_len_int. Параметр s является указателем, ссылающимся на изменяемый строковый буфер, в который будет записана строка в формате BWSTR. Размер этого буфера задается в параметр s_len. Размер строкового буфера должен быть на 1 элемент больше массива пикселей, так как в конец строки вставляется нулевой байт. Все значения равные 0 будут преобразованы в '0'. Все остальные значения будут преобразованы в '1'. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_to_bwstr = _ulibc.uimagegray_to_bwstr
_uimagegray_to_bwstr.argtypes = [
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
   ctypes.c_char_p, ctypes.c_int]
_uimagegray_to_bwstr.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
s = ctypes.create_string_buffer(arr._length_ + 1)
print(ctypes.sizeof(s)) # 7
print(arr._length_)     # 6
print(s[:])  # b'\x00\x00\x00\x00\x00\x00\x00'
print(s.raw) # b'\x00\x00\x00\x00\x00\x00\x00'
res = _uimagegray_to_bwstr(arr, arr._length_, s, ctypes.sizeof(s))
print(res)              # 1
print(s[:])             # b'011111\x00'
print(s.value)          # b'011111'
print(s.value.decode()) # '011111'

Создать объект UImageGray на основе строки в формате BWSTR позволяет функция uimagegray_from_bwstr(). Прототип функции:

int uimagegray_from_bwstr(char* s, unsigned char* parr_int,
                          int arr_len_int);

Код описания параметров для Python:

_uimagegray_from_bwstr = _ulibc.uimagegray_from_bwstr
_uimagegray_from_bwstr.argtypes = [ctypes.c_char_p,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_bwstr.restype = ctypes.c_int

Параметр s является указателем на C-строку в формате BWSTR. Параметр parr_int является указателем, ссылающимся на массив пикселей в который будет записан результат. Размер этого массива задается в параметре arr_len_int. Длина строки должна быть равна числу элементов массива пикселей. Все значения равные '0' будут преобразованы в 0. Все остальные значения будут преобразованы в 255. Функция возвращает значение 1 (UIMAGEGRAY_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGEGRAY_ERR). Пример:

_uimagegray_from_bwstr = _ulibc.uimagegray_from_bwstr
_uimagegray_from_bwstr.argtypes = [ctypes.c_char_p,
   ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagegray_from_bwstr.restype = ctypes.c_int
s = "011111"
bwstr = s.encode()
print(bwstr) # b'011111'
arr = (ctypes.c_ubyte * len(bwstr))()
print(arr[:])
# [0, 0, 0, 0, 0, 0]
res = _uimagegray_from_bwstr(bwstr, arr, arr._length_)
print(res) # 1
print(arr[:])
# [0, 255, 255, 255, 255, 255]

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

Категория: UImage C | Просмотров: 6 | Добавил: unicross | Теги: UImageC, UImageGray | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Списки слов [10]
Списки слов и словари
OCR [4]
Оптическое распознавание символов
UImage [80]
Графическая библиотека для Python
UImage C [7]
Графическая библиотека для Python
Программы [4]
Полезные программы
Прочее [3]
Другие темы
Календарь
«  Январь 2026  »
Пн Вт Ср Чт Пт Сб Вс
   1234
567891011
12131415161718
19202122232425
262728293031