как преобразовать изображение png в двоичный код 1,0 без PIL/numpy Python

введите сюда описание изображения

Всем привет.

конечная цель - проецировать изображение на монохромный/светодиодный экран Имеем маленькое изображение, чернобелое, изначально в png формате. размеры в районе 100х100рх а то и меньше. (Пример в самом начале)

Имеем Paint.net который позволяет конвертировать в bmp, jpeg, tiff, tga и что-то там ещё, если нужно уточню. Также имеем GIMP который превращает нам png в pbm.

Вопрос. как легко и быстро превратить изображение в (перфокарту) табличку из нулей и единичек. Вроде как pbm уже состоит из нулей и единичек. Но у меня получилось прочитать его только как последовательность байтов. И да, план в том, чтобы потом на микроконтроллере всё это запускать. Так что нужно всё сделать минимумом базового функционала


Ответы (2 шт):

Автор решения: cauf

Попробуй так:


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 выравнивает полученные двоичные числа по указанной длинне

→ Ссылка
Автор решения: eri

Нужно уменьшить количество цветов до двух - тогда один пиксель займет один бит. Но ещё и картинка должна получится читаемая.

Берем 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
→ Ссылка