我该如何实现位图?

5 投票
2 回答
18483 浏览
提问于 2025-04-11 09:23

我想在Python中实现一个二维位图类。这个类需要满足以下要求:

  1. 能够创建任意大小的二维位图。比如说,创建一个8 x 8的位图(8个字节),可以像这样:

    bitmap = Bitmap(8,8)
    
  2. 提供一个接口,可以以布尔值或整数值的形式访问这个二维位图中的每一位,也就是说:

    if bitmap[1, 2] or bitmap.get(0, 1)
    
  3. 能够将数据以压缩的二进制形式提取出来。简单来说,就是把位图的每一行连接起来,然后返回为二进制数据。可能会填充到最近的字节或类似的方式。

    bitmap.data()
    
  4. 能够根据提取到的二进制数据创建新的位图:

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

我知道Python可以进行二进制操作,但我希望能得到一些建议,关于如何最好地使用这些操作来实现这个类。

2 个回答

5

你不需要自己去创建这个。

可以使用非常好用的 Pillow库,它是原来的Python图像库(PIL)的升级版,而原来的PIL已经不再更新了。

8

位打包 numpy(SciPY)数组正是你所需要的功能。这个例子展示了一个4行3列的布尔数组是如何打包成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库。

撰写回答