UImageRGB C API: изображение RGB
Обработка изображений в формате RGB в UImage C API выполняется с помощью функций из библиотеки libuimagergb.dll. Инструкция подключения библиотеки в Python с помощью модуля ctypes:
import os.path
import ctypes
dll_path = r"D:\UImageC\unicross_img\bin"
_ulibpath = os.path.abspath(os.path.join(dll_path, "libuimagergb.dll"))
_ulibc = ctypes.CDLL(_ulibpath)
В заголовочном файле uimagergb.h определены следующие константы, задающие ограничения:
// Логическое значение true
#define UIMAGERGB_TRUE 1
// Логическое значение false
#define UIMAGERGB_FALSE 0
// Значение, означающее ошибку при выполнении функции
#define UIMAGERGB_ERR (-1)
// Максимальная ширина изображения
#define UIMAGERGB_MAX_W 8000
// Максимальная высота изображения
#define UIMAGERGB_MAX_H 8000
// Максимальный размер массива с пикселями (8000 * 8000 * 3)
#define UIMAGERGB_MAX_SIZE 192000000
В этом же файле объявлены структуры для хранения изображений:
typedef struct {
int width;
int height;
unsigned char* parr;
} UImageRGB;
typedef struct {
int width;
int height;
int* parr;
} UImageRgbI;
typedef struct {
int width;
int height;
float* parr;
} UImageRgbF;
typedef struct {
int width;
int height;
double* parr;
} UImageRgbD;
Заливка изображения цветом
Функция uimagergb_fill() позволяет присвоить всем пикселям изображения указанное значение. Прототип функции:
int uimagergb_fill(int w, int h, unsigned char* parr, int arr_len,
int r, int g, int b);
Код описания параметров для Python:
_uimagergb_fill = _ulibc.uimagergb_fill
_uimagergb_fill.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.c_int, ctypes.c_int, ctypes.c_int]
_uimagergb_fill.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметре arr_len. Значения в диапазоне от 0 до 255, которые заполнят весь массив, указываются в параметрах r, g и b. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGERGB_TRUE), а в случае ошибки — значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_fill = _ulibc.uimagergb_fill
_uimagergb_fill.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.c_int, ctypes.c_int, ctypes.c_int]
_uimagergb_fill.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = (ctypes.c_ubyte * (w * h * ch))()
print(arr[:])
# [0, 0, 0, 0, 0, 0, 0, 0, 0,
# 0, 0, 0, 0, 0, 0, 0, 0, 0]
res = _uimagergb_fill(w, h, arr, arr._length_, 255, 128, 64)
print(res) # 1
print(arr[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
Инверсия цвета
Инвертировать цвет всех пикселей позволяет функция uimagergb_invert(). Прототип функции:
int uimagergb_invert(unsigned char* parr, int arr_len);
Код описания параметров для Python:
_uimagergb_invert = _ulibc.uimagergb_invert
_uimagergb_invert.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_invert.restype = ctypes.c_int
Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметре arr_len. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGERGB_TRUE), а в случае ошибки — значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_invert = _ulibc.uimagergb_invert
_uimagergb_invert.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_invert.restype = ctypes.c_int
arr = (ctypes.c_ubyte * 6)(255, 255, 255, 255, 255, 255)
print(arr[:])
# [255, 255, 255, 255, 255, 255]
res = _uimagergb_invert(arr, arr._length_)
print(res) # 1
print(arr[:])
# [0, 0, 0, 0, 0, 0]
arr = (ctypes.c_ubyte * 6)(0, 64, 128, 200, 254, 255)
res = _uimagergb_invert(arr, arr._length_)
print(res) # 1
print(arr[:])
# [255, 191, 127, 55, 1, 0]
Преобразование целочисленного диапазона в вещественный и наоборот
Преобразовать целочисленный диапазон значений от 0 до 255 в вещественный диапазон от 0.0 до 1.0 позволяет функция uimagergb_ubyte_to_double(). Прототип функции:
int uimagergb_ubyte_to_double(
unsigned char* parr_int, int arr_len_int,
double* parr_f, int arr_len_f);
Код описания параметров для Python:
_uimagergb_ubyte_to_double = _ulibc.uimagergb_ubyte_to_double
_uimagergb_ubyte_to_double.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_double), ctypes.c_int]
_uimagergb_ubyte_to_double.restype = ctypes.c_int
Параметр parr_int является указателем, ссылающимся на массив с целочисленными значениями. Размер этого массива задается в параметре arr_len_int. Параметр parr_f является указателем, ссылающимся на массив с вещественными значениями. Размер этого массива задается в параметре arr_len_f. Значения из массива parr_int после преобразования будут записаны в массив parr_f. Размеры массивов должны совпадать. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGERGB_TRUE), а в случае ошибки — значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_ubyte_to_double = _ulibc.uimagergb_ubyte_to_double
_uimagergb_ubyte_to_double.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_double), ctypes.c_int]
_uimagergb_ubyte_to_double.restype = ctypes.c_int
arr_int = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
print(arr_int[:])
# [0, 64, 128, 255]
arr_f = (ctypes.c_double * 4)()
print(arr_f[:])
# [0.0, 0.0, 0.0, 0.0]
res = _uimagergb_ubyte_to_double(arr_int, arr_int._length_,
arr_f, arr_f._length_)
print(res) # 1
print(arr_f[:])
# [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]
Преобразовать вещественный диапазон от 0.0 до 1.0 в целочисленный диапазон значений от 0 до 255 позволяет функция uimagergb_double_to_ubyte(). Прототип функции:
int uimagergb_double_to_ubyte(double* parr_f, int arr_len_f,
unsigned char* parr_int, int arr_len_int);
Код описания параметров для Python:
_uimagergb_double_to_ubyte = _ulibc.uimagergb_double_to_ubyte
_uimagergb_double_to_ubyte.argtypes = [
ctypes.POINTER(ctypes.c_double), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_double_to_ubyte.restype = ctypes.c_int
Параметр parr_f является указателем, ссылающимся на массив с вещественными значениями. Размер этого массива задается в параметре arr_len_f. Параметр parr_int является указателем, ссылающимся на массив с целочисленными значениями. Размер этого массива задается в параметре arr_len_int. Значения из массива parr_f после преобразования будут записаны в массив parr_int. Размеры массивов должны совпадать. Перед преобразованием выполняется нормализация диапазона. Если операция выполнена успешно, то функция вернет значение 1 (UIMAGERGB_TRUE), а в случае ошибки — значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_double_to_ubyte = _ulibc.uimagergb_double_to_ubyte
_uimagergb_double_to_ubyte.argtypes = [
ctypes.POINTER(ctypes.c_double), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_double_to_ubyte.restype = ctypes.c_int
arr = [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]
arr_f = (ctypes.c_double * 4)(*arr)
print(arr_f[:])
# [0.0, 0.25098039215686274, 0.5019607843137255, 1.0]
arr_int = (ctypes.c_ubyte * 4)()
print(arr_int[:])
# [0, 0, 0, 0]
res = _uimagergb_double_to_ubyte(arr_f, arr_f._length_,
arr_int, arr_int._length_)
print(res) # 1
print(arr_int[:])
# [0, 64, 128, 255]
Сравнение изображений
Сравнить два изображения можно с помощью функции uimagergb_cmp(). Прототип функции:
int uimagergb_cmp(unsigned char* parr1, int arr1_len,
unsigned char* parr2, int arr2_len);
Код описания параметров для Python:
_uimagergb_cmp = _ulibc.uimagergb_cmp
_uimagergb_cmp.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_cmp.restype = ctypes.c_int
Параметр parr1 является указателем, ссылающимся на массив с пикселями первого изображения. Размер этого массива задается в параметре arr1_len. Параметр parr2 является указателем, ссылающимся на массив с пикселями второго изображения. Размер этого массива задается в параметре arr2_len. Функция возвращает значение 1 (UIMAGERGB_TRUE), если в изображении равны, и 0 (UIMAGERGB_FALSE) — в противном случае. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_cmp = _ulibc.uimagergb_cmp
_uimagergb_cmp.argtypes = [
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_cmp.restype = ctypes.c_int
arr1 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr2 = (ctypes.c_ubyte * 4)(0, 64, 128, 255)
arr3 = (ctypes.c_ubyte * 4)(0, 64, 128, 0)
res = _uimagergb_cmp(arr1, arr1._length_, arr2, arr2._length_)
print(res) # 1
res = _uimagergb_cmp(arr1, arr1._length_, arr3, arr3._length_)
print(res) # 0
print(arr1 == arr2) # False
Вычисление гистограммы
Вычислить гистограмму изображения, преобразованного в оттенки серого цвета, позволяет функция uimagergb_histogram_gray(). Прототип функции:
int uimagergb_histogram_gray(int w, int h,
unsigned char* parr, int arr_len,
int* phist, int hist_len);
Код описания параметров для Python:
_uimagergb_histogram_gray = _ulibc.uimagergb_histogram_gray
_uimagergb_histogram_gray.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagergb_histogram_gray.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр phist является указателем, ссылающимся на массив в который будет записана гистограмма. Размер этого массива задается в параметре hist_len. Размер массива с гистограммой должен быть равен 257. Индексы первых 256 элементов соответствуют коду цвета в оттенках серого. Значения элементов соответствуют числу пикселей с таким цветом внутри изображения. Последний элемент массива содержит общее число пикселей в изображении. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_histogram_gray = _ulibc.uimagergb_histogram_gray
_uimagergb_histogram_gray.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagergb_histogram_gray.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [0, 0, 0, 0, 0, 0, 128, 128, 128,
255, 255, 255, 255, 255, 255, 255, 255, 255]
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [0, 0, 0, 0, 0, 0, 128, 128, 128,
# 255, 255, 255, 255, 255, 255, 255, 255, 255]
hist = (ctypes.c_int * 257)()
res = _uimagergb_histogram_gray(w, h, arr2, arr2._length_,
hist, hist._length_)
print(res) # 1
print(hist[0]) # 2 (число черных пикселей)
print(hist[255]) # 3 (число белых пикселей)
print(hist[128]) # 1 (число пикселей с цветом 128)
print(hist[64]) # 0 (число пикселей с цветом 64)
print(hist[256]) # 6 (число всех пикселей)
Вычислить гистограммы для всех каналов изображения позволяет функция uimagergb_histogram(). Прототип функции:
int uimagergb_histogram(int w, int h,
unsigned char* parr, int arr_len,
int* phist_r, int hist_len_r,
int* phist_g, int hist_len_g,
int* phist_b, int hist_len_b);
Код описания параметров для Python:
_uimagergb_histogram = _ulibc.uimagergb_histogram
_uimagergb_histogram.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagergb_histogram.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр phist_r является указателем, ссылающимся на массив в который будет записана гистограмма красного канала. Размер этого массива задается в параметре hist_len_r. Параметр phist_g является указателем, ссылающимся на массив в который будет записана гистограмма зеленого канала. Размер этого массива задается в параметре hist_len_g. Параметр phist_b является указателем, ссылающимся на массив в который будет записана гистограмма синего канала. Размер этого массива задается в параметре hist_len_b.
Размеры массивов с гистограммами должны быть равны 257. Индексы первых 256 элементов соответствуют коду цвета. Значения элементов соответствуют числу пикселей с таким цветом внутри канала. Последний элемент массива содержит общее число пикселей в канале. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_histogram = _ulibc.uimagergb_histogram
_uimagergb_histogram.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int,
ctypes.POINTER(ctypes.c_int), ctypes.c_int]
_uimagergb_histogram.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [0, 0, 0, 0, 0, 0, 128, 128, 128,
255, 255, 255, 255, 255, 255, 255, 255, 255]
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [0, 0, 0, 0, 0, 0, 128, 128, 128,
# 255, 255, 255, 255, 255, 255, 255, 255, 255]
hist_r = (ctypes.c_int * 257)()
hist_g = (ctypes.c_int * 257)()
hist_b = (ctypes.c_int * 257)()
res = _uimagergb_histogram(w, h, arr2, arr2._length_,
hist_r, hist_r._length_,
hist_g, hist_g._length_,
hist_b, hist_b._length_)
print(res) # 1
print(hist_r[0]) # 2 (число черных пикселей в красном канале)
print(hist_r[255]) # 3 (число белых пикселей в красном канале)
print(hist_r[128]) # 1 (число пикселей с цветом 128 в красном канале)
print(hist_r[64]) # 0 (число пикселей с цветом 64 в красном канале)
print(hist_r[256]) # 6 (число всех пикселей в красном канале)
Разделение на каналы
Разделить изображение на отдельные каналы позволяет функция uimagergb_split(). Прототип функции:
int uimagergb_split(int w, int h, unsigned char* parr, int arr_len,
unsigned char* parr_r, int parr_len_r,
unsigned char* parr_g, int parr_len_g,
unsigned char* parr_b, int parr_len_b);
Код описания параметров для Python:
_uimagergb_split = _ulibc.uimagergb_split
_uimagergb_split.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_split.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр parr_r является указателем, ссылающимся на массив в который будет записан красный канал. Размер этого массива задается в параметре parr_len_r. Параметр parr_g является указателем, ссылающимся на массив в который будет записан зеленый канал. Размер этого массива задается в параметре parr_len_g. Параметр parr_b является указателем, ссылающимся на массив в который будет записан синий канал. Размер этого массива задается в параметре parr_len_b. Размеры массивов с каналами должны быть равны w * h. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_split = _ulibc.uimagergb_split
_uimagergb_split.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_split.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [255, 128, 64] * (w * h)
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
arr_r = (ctypes.c_ubyte * (w * h))()
arr_g = (ctypes.c_ubyte * (w * h))()
arr_b = (ctypes.c_ubyte * (w * h))()
res = _uimagergb_split(w, h, arr2, arr2._length_,
arr_r, arr_r._length_,
arr_g, arr_g._length_,
arr_b, arr_b._length_)
print(res) # 1
print(arr_r[:]) # [255, 255, 255, 255, 255, 255]
print(arr_g[:]) # [128, 128, 128, 128, 128, 128]
print(arr_b[:]) # [64, 64, 64, 64, 64, 64]
Получить все значения из красного канала позволяет функция uimagergb_red_channel(). Прототип функции:
int uimagergb_red_channel(int w, int h,
unsigned char* parr, int arr_len,
unsigned char* parr_r, int parr_len_r);
Код описания параметров для Python:
_uimagergb_red_channel = _ulibc.uimagergb_red_channel
_uimagergb_red_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_red_channel.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр parr_r является указателем, ссылающимся на массив в который будет записан красный канал. Размер этого массива задается в параметре parr_len_r. Размер массива с каналом должен быть равен w * h. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_red_channel = _ulibc.uimagergb_red_channel
_uimagergb_red_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_red_channel.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [255, 128, 64] * (w * h)
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
arr_r = (ctypes.c_ubyte * (w * h))()
res = _uimagergb_red_channel(w, h, arr2, arr2._length_,
arr_r, arr_r._length_)
print(res) # 1
print(arr_r[:]) # [255, 255, 255, 255, 255, 255]
Получить все значения из зеленого канала позволяет функция uimagergb_green_channel(). Прототип функции:
int uimagergb_green_channel(int w, int h,
unsigned char* parr, int arr_len,
unsigned char* parr_g, int parr_len_g);
Код описания параметров для Python:
_uimagergb_green_channel = _ulibc.uimagergb_green_channel
_uimagergb_green_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_green_channel.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр parr_g является указателем, ссылающимся на массив в который будет записан зеленый канал. Размер этого массива задается в параметре parr_len_g. Размер массива с каналом должен быть равен w * h. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_green_channel = _ulibc.uimagergb_green_channel
_uimagergb_green_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_green_channel.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [255, 128, 64] * (w * h)
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
arr_g = (ctypes.c_ubyte * (w * h))()
res = _uimagergb_green_channel(w, h, arr2, arr2._length_,
arr_g, arr_g._length_)
print(res) # 1
print(arr_g[:]) # [128, 128, 128, 128, 128, 128]
Получить все значения из синего канала позволяет функция uimagergb_blue_channel(). Прототип функции:
int uimagergb_blue_channel(int w, int h,
unsigned char* parr, int arr_len,
unsigned char* parr_b, int parr_len_b);
Код описания параметров для Python:
_uimagergb_blue_channel = _ulibc.uimagergb_blue_channel
_uimagergb_blue_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_blue_channel.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив с пикселями. Размер этого массива задается в параметр arr_len. Параметр parr_b является указателем, ссылающимся на массив в который будет записан синий канал. Размер этого массива задается в параметре parr_len_b. Размер массива с каналом должен быть равен w * h. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_blue_channel = _ulibc.uimagergb_blue_channel
_uimagergb_blue_channel.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_blue_channel.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr = [255, 128, 64] * (w * h)
arr2 = (ctypes.c_ubyte * len(arr))(*arr)
print(arr2[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
arr_b = (ctypes.c_ubyte * (w * h))()
res = _uimagergb_blue_channel(w, h, arr2, arr2._length_,
arr_b, arr_b._length_)
print(res) # 1
print(arr_b[:]) # [64, 64, 64, 64, 64, 64]
Сборка из каналов
Собрать изображение из отдельных каналов позволяет функция uimagergb_merge(). Прототип функции:
int uimagergb_merge(int w, int h, unsigned char* parr, int arr_len,
unsigned char* parr_r, int parr_len_r,
unsigned char* parr_g, int parr_len_g,
unsigned char* parr_b, int parr_len_b);
Код описания параметров для Python:
_uimagergb_merge = _ulibc.uimagergb_merge
_uimagergb_merge.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_merge.restype = ctypes.c_int
Параметр w задает ширину изображения,а параметр h — его высоту. Параметр parr является указателем, ссылающимся на массив в который будет записан результат. Размер этого массива задается в параметр arr_len. Параметр parr_r является указателем, ссылающимся на массив с красным каналом. Размер этого массива задается в параметре parr_len_r. Параметр parr_g является указателем, ссылающимся на массив с зеленым каналом. Размер этого массива задается в параметре parr_len_g. Параметр parr_b является указателем, ссылающимся на массив с синим каналом. Размер этого массива задается в параметре parr_len_b. Размеры массивов с каналами должны быть равны w * h. Функция возвращает значение 1 (UIMAGERGB_TRUE), если операция выполнена успешно. При ошибке возвращается значение -1 (UIMAGERGB_ERR). Пример:
_uimagergb_merge = _ulibc.uimagergb_merge
_uimagergb_merge.argtypes = [ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int,
ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]
_uimagergb_merge.restype = ctypes.c_int
w, h, ch = 3, 2, 3
arr_rgb = (ctypes.c_ubyte * (w * h * ch))()
print(arr_rgb[:])
# [0, 0, 0, 0, 0, 0, 0, 0, 0,
# 0, 0, 0, 0, 0, 0, 0, 0, 0]
arr_r = (ctypes.c_ubyte * (w * h))(255, 255, 255, 255, 255, 255)
arr_g = (ctypes.c_ubyte * (w * h))(128, 128, 128, 128, 128, 128)
arr_b = (ctypes.c_ubyte * (w * h))(64, 64, 64, 64, 64, 64)
res = _uimagergb_merge(w, h, arr_rgb, arr_rgb._length_,
arr_r, arr_r._length_,
arr_g, arr_g._length_,
arr_b, arr_b._length_)
print(res) # 1
print(arr_rgb[:])
# [255, 128, 64, 255, 128, 64, 255, 128, 64,
# 255, 128, 64, 255, 128, 64, 255, 128, 64]
Класс входит в состав графической библиотеки UImageC. Описание библиотеки UImageC
|