как преобразовать изображение png в двоичный код 1,0 без PIL/numpy Python
Всем привет.
конечная цель - проецировать изображение на монохромный/светодиодный экран Имеем маленькое изображение, чернобелое, изначально в png формате. размеры в районе 100х100рх а то и меньше. (Пример в самом начале)
Имеем Paint.net который позволяет конвертировать в bmp, jpeg, tiff, tga и что-то там ещё, если нужно уточню. Также имеем GIMP который превращает нам png в pbm.
Вопрос. как легко и быстро превратить изображение в (перфокарту) табличку из нулей и единичек. Вроде как pbm уже состоит из нулей и единичек. Но у меня получилось прочитать его только как последовательность байтов. И да, план в том, чтобы потом на микроконтроллере всё это запускать. Так что нужно всё сделать минимумом базового функционала
Ответы (2 шт):
Попробуй так:
with open(path, mode="rb") as pbmfl:
br = pbmfl.read()
def alignment(bin_num, target_len):
cur_len = len(bin_num)
if cur_len < target_len:
return f'{"0"*(target_len-cur_len)}{bin_num}'
else:
return bin_num
bin_data = [alignment(f'{bs:b}', 8) for bs in list(br)])
print(''.join(bin_data))
Здесь функция alignment выравнивает полученные двоичные числа по указанной длинне
Нужно уменьшить количество цветов до двух - тогда один пиксель займет один бит. Но ещё и картинка должна получится читаемая.
Берем Gimp и картинку
яркость-контраст, кадрирование, масштабирование, обесцвечивание до чб и в конце "изображение-режим-индексированное" и получается такая картинка под однобитный жк-дисплей. (256*256 увеличенно)
Не очень удобное изображение для 100*100, но ещё узнаваемо
Нажимаем экспортировать - и выбираем формат "заголовочный файл h"
/* GIMP header image file format (INDEXED): /home/eri/Pictures/1567355672115958410.h */
static unsigned int width = 256;
static unsigned int height = 256;
static unsigned char header_data_cmap[256][3] = {
{ 0, 0, 0},
{255,255,255},
{255,255,255},
{255,255,255},
....
};
static unsigned char header_data[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
0,1,0,1,0,0,1,0,0,1,0,1,0,1,0,1,
0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
...
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
header_data_cmap можно удалить - это для цветных изображений, а header_data проходишь циклом и отправляешь прямиком на экран.
Упаковка в unsigned char это в восемь раз больше чем нужно, но зато никакой логики в программе на контроллере. В формате PBM (text) будет последовательность текстом 0101010...
Если сохранить в PBM (raw, binary) , то читаешь по байту и дополнительным циклом со сдвигом получай единицы и нули.
for b in data:
for i in xrange(8):
yield (b >> i) & 1



