2008-10-05 2 views
2

Я хочу реализовать 2-битный класс карты в Python. Класс должен иметь следующие требования:Как реализовать битовую карту?

  1. Разрешить создание произвольных размеров 2d растровых изображений. т.е. создать-х 8 битовые карту (8 байт), что-то вроде:

    bitmap = Bitmap(8,8) 
    
  2. предоставляет API для доступа бит в этом 2d карте в виде логических или даже целых значений, то есть:

    if bitmap[1, 2] or bitmap.get(0, 1) 
    
  3. Возможность получения данных в виде упакованных двоичных данных. По существу, каждая строка битовой карты объединяется и возвращается как двоичные данные. Он может быть дополнен до ближайшего байта или чего-то подобного.

    bitmap.data() 
    
  4. Уметь создавать новые карты из двоичных данных, извлекаемых:

    new_bitmap = Bitmap(8, 8, bitmap.data()) 
    

Я знаю, Python способен выполнять бинарные операции, но я хотел бы некоторые предложения относительно того, как лучше использовать их для реализации этого класса.

ответ

4

Bit-Packing Numpy (SciPY) массивов делает то, что вы ищете. В примере показан 4x3 бит (Boolean) массив, упакованный в 4 8-битных байта. unpackbits распаковывает массивы uint8 в логический выходной массив, который вы можете использовать в вычислениях.

>>> a = np.array([[[1,0,1], 
...    [0,1,0]], 
...    [[1,1,0], 
...    [0,0,1]]]) 
>>> b = np.packbits(a,axis=-1) 
>>> b 
array([[[160],[64]],[[192],[32]]], dtype=uint8) 

Если вам нужны 1-битные пиксельные изображения, PIL - это место для поиска.

Смежные вопросы