Выходной формат цветов пикселей на рендере в Blender – RGBA в линейном цветовом диапазоне. Если нужно сохранить рендер в формате RGB565, такой формат используется, например, в некоторых старых играх, значения цвета пикселей необходимо преобразовать.
Для примера, возьмем значение цвета для одного пикселя с изображения, полученного с нода композитинга Viewer Node.
1 2 3 |
bpy.data.images['Viewer Node'].pixels[0:4] # (0.5, 0.0, 0.0, 1.0) |
Для начала преобразуем его в цветовое пространство sRGB:
1 2 3 |
tuple(linear_to_srgb(col) for col in bpy.data.images['Viewer Node'].pixels[0:4]) # (188, 0, 0, 255) |
Получив значение цвета в общепринятом для 2D цветовом диапазоне, мы теперь можем преобразовать его в нужный нам формат.
Определим функцию для преобразования цвета из формата RGBA в формат RGB565:
1 2 3 4 5 6 7 8 9 10 |
def rgba_rgb565(rgba): r, g, b, a = rgba r = r >> 3 g = g >> 2 b = b >> 3 rgb565 = 0x0000 rgb565 |= ((r & 0x1F) << 11) rgb565 |= ((g & 0x3F) << 5) rgb565 |= (b & 0x1F) return rgb565 |
В параметре функции мы передаем значение цвета в формате RGBA – набор из четырех значений, каждое в диапазоне от 0 до 255. На выходе мы получаем двухбайтовое значение в формате RGB565 в диапазоне от 0 до 65536.
1 2 3 |
print(rgba_rgb565([188, 0, 0, 255])) # 47104 |
Для сохранения целого изображения, каждую его точку нужно прогнать через нашу функцию, получив в итоге массив значений в формате RGB565, который уже можно сохранять в файл.