DDB,DIB以及bitmap
- 背景
- 1.DDB
- 2.DIB
- 3.Bitmap的结构
-
- [3.1 Bitmap文件头](#3.1 Bitmap文件头)
- [3.2 Bitmap信息头](#3.2 Bitmap信息头)
- [3.3 颜色表](#3.3 颜色表)
- [3.4 位图数据](#3.4 位图数据)
- [4. 位图实验](#4. 位图实验)
-
- [4.1 实验1(分辨率15x16)](#4.1 实验1(分辨率15x16))
- [4.2 实验2(分辨率16x16)](#4.2 实验2(分辨率16x16))
背景
之前学习过 杨淑莹老师的-<<VC++图像处理程序设计>>,当时只是把视频教程看了一遍,没有做一些实验,根基不牢.后续会根据杨老师的教程,把该做的实验都做一遍. 关于图像处理方面,虽然现在已经都是深度学习,大语言模型了,但这里我觉得还是有必要记录一下.
1.DDB
DDB 全称device dependent bitmap,即设备有关的位图,DDB数据本身不带颜色信息,颜色信息和具体的显示设备有关.我的理解是DDB数据存放的是颜色的索引信息,在不同设备上存在不同的调色板,然后根据颜色的索引,从调色板中找到颜色信息,所以这个颜色是和具体设备有关的.
比如:
一个2 x 2的DDB数据为
22, 33
12, 38
那么在不同设备上的调色板dev1colorTable[255], dev2ColorTable[255],这2个调色板中保存是相关设备的颜色信息,他们应该是不同的,所以同一个索引,在不同索引下可能得到不同的颜色信息.
2.DIB
DIB全称是device independent bitmap,即设备无关位图. 为什么无关呢.主要是因为这种位图数据中包含了颜色信息.针对于非真彩色的图片(24bit),它的图像中是带有颜色表信息的,后面会有实验做详细介绍的.
3.Bitmap的结构
Bitmap图像文件一般包含如下4个部分
- Bitmap文件头
- Bitmap图像信息头
- 颜色表
- 图像数据
后续的实验都会用bitmap来演示
3.1 Bitmap文件头
注意:
- WORD:2个bytes,
- DWORD:4bytes,
下面是BItmap文件头的信息,其中包含文件类型,必须是"BM"(图中有错误 )

3.2 Bitmap信息头
这部分包含了位图相关的一些属性,包含图像宽,高,大小,以及像素的bitcount.

3.3 颜色表
注意只有非真彩(非24bit)的图像有颜色表,真彩图像因为已经是24bit的RGB数据,它已经不需要颜色信息了.
3.4 位图数据
在文件最后是位图数据部分,这里特别要注意的是一个byte代表几个像素. 关于这个要从bitCount中获取信息了.
不同的bitCount,每个byte对应不同数量的像素
- 当上面biBitCount为1时,表示8个像素占用1个字节,其实这种情况下,位图就是单色图,或二值图
- 当上面biBitCount为4时,表示2个像素占用1个字节
- 当上面biBitCount为8时,表示1个像素占用1个字节
- 当上面biBitCount为24时,表示1个像素占用3个字节
4. 位图实验
这里我用AI写了一个python脚本,用来解析bitmap图像的信息
4.1 实验1(分辨率15x16)
- 原始图像: 这个图像是一个15x16的闹钟的图片.

- windows位图信息:
从下面能够获取到图片大小为246,分辨率为15x16(宽高)

- 解析结果:
这个解析脚本可以解析文件头,bitmap信息头,颜色表以及图像数据.最后会打印出图像数据
xml
--- 开始解析 BMP 文件: .\Icons\Alarm.bmp --- \
--- BMP File Header (文件头) ---
Signature (文件标识): BM (b'BM')
File Size (文件大小): 246 bytes (0xf6)
Reserved1 (保留字段1): 0 (0x0)
Reserved2 (保留字段2): 0 (0x0)
Data Offset (数据偏移): 118 bytes (0x76)
--- BMP Info Header (信息头) ---
Header Size (信息头大小): 40 bytes (0x28)
Width (图像宽度): 15 pixels
Height (图像高度): 16 pixels
Planes (颜色平面): 1
Bits Per Pixel (位深度): 4 bit(s)
Compression (压缩方式): BI_RGB (不压缩)
Image Size (图像数据大小): 128 bytes (0表示未压缩或需计算)
X Pixels Per Meter (水平分辨率): 2850 ppm
Y Pixels Per Meter (垂直分辨率): 2850 ppm
Colors Used (使用颜色数): 16
Important Colors (重要颜色数): 16
--- BMP Color Palette (颜色表) ---
预期颜色表项数 (根据位深): 16
实际颜色表项数 (由Header指定): 16
[000] RGB( 0, 0, 0) - Raw: (00 00 00 00)
[001] RGB(128, 0, 0) - Raw: (00 00 80 00)
[002] RGB( 0, 128, 0) - Raw: (00 80 00 00)
[003] RGB(128, 128, 0) - Raw: (00 80 80 00)
[004] RGB( 0, 0, 128) - Raw: (80 00 00 00)
[005] RGB(128, 0, 128) - Raw: (80 00 80 00)
[006] RGB( 0, 128, 128) - Raw: (80 80 00 00)
[007] RGB(127, 127, 127) - Raw: (7f 7f 7f 00)
[008] RGB(191, 191, 191) - Raw: (bf bf bf 00)
[009] RGB(255, 0, 0) - Raw: (00 00 ff 00)
[010] RGB( 0, 255, 0) - Raw: (00 ff 00 00)
[011] RGB(255, 255, 0) - Raw: (00 ff ff 00)
[012] RGB( 0, 0, 255) - Raw: (ff 00 00 00)
[013] RGB(255, 0, 255) - Raw: (ff 00 ff 00)
[014] RGB( 0, 255, 255) - Raw: (ff ff 00 00)
[015] RGB(255, 255, 255) - Raw: (ff ff ff 00)
--- BMP Bitmap Data (位图数据) ---
当前文件指针位置: 118 bytes
声明的数据偏移量: 118 bytes
文件指针已位于位图数据起始处。
剩余待读取数据大小: 128 bytes
计算的扫描线大小 (含填充): 8 bytes
计算的总数据大小: 128 bytes
数据内容 (按每行16个字节显示):
00000076: 30 01 30 00 00 31 00 33 33 10 00 90 90 00 13 33 | b'0\x010\x00\x001\x0033\x10\x00\x90\x90\x00\x133'
00000086: 33 00 98 f0 f8 90 03 33 37 09 80 ff f0 89 07 33 | b'3\x00\x98\xf0\xf8\x90\x0337\t\x80\xff\xf0\x89\x073'
00000096: 30 99 ff 0f ff f9 90 33 30 90 ff f0 ff 00 90 33 | b'0\x99\xff\x0f\xff\xf9\x9030\x90\xff\xf0\xff\x00\x903'
000000a6: 30 99 ff f0 ff f9 90 33 37 09 80 f0 f0 89 07 3c | b'0\x99\xff\xf0\xff\xf9\x9037\t\x80\xf0\xf0\x89\x07<'
000000b6: 33 00 98 f0 f8 90 03 30 00 00 09 99 99 00 00 03 | b'3\x00\x98\xf0\xf8\x90\x030\x00\x00\t\x99\x99\x00\x00\x03'
000000c6: 08 87 00 00 00 08 77 03 08 88 87 70 78 88 87 03 | b'\x08\x87\x00\x00\x00\x08w\x03\x08\x88\x87px\x88\x87\x03'
000000d6: 30 78 80 70 70 88 70 33 33 70 03 30 33 00 73 33 | b'0x\x80pp\x88p33p\x0303\x00s3'
000000e6: 33 33 33 00 03 33 33 33 33 33 33 33 33 33 33 33 | b'333\x00\x0333333333333'
--- BMP Decoded Pixels (解码后的像素) ---
使用颜色表解析 15x16 像素数据...
总共解析出 240 个像素索引。
按 15x16 布局打印 (注意BMP图像通常从底部开始存储):
Row 0: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 1: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 2: [128,128, 0] [128,128, 0] [127,127,127] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [127,127,127] [128,128, 0] [128,128, 0]
Row 3: [128,128, 0] [ 0, 0, 0] [127,127,127] [191,191,191] [191,191,191] [ 0, 0, 0] [127,127,127] [ 0, 0, 0] [127,127,127] [ 0, 0, 0] [191,191,191] [191,191,191] [127,127,127] [ 0, 0, 0] [128,128, 0]
Row 4: [ 0, 0, 0] [191,191,191] [191,191,191] [191,191,191] [191,191,191] [127,127,127] [127,127,127] [ 0, 0, 0] [127,127,127] [191,191,191] [191,191,191] [191,191,191] [191,191,191] [127,127,127] [ 0, 0, 0]
Row 5: [ 0, 0, 0] [191,191,191] [191,191,191] [127,127,127] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [191,191,191] [127,127,127] [127,127,127] [ 0, 0, 0]
Row 6: [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [255, 0, 0] [255, 0, 0] [255, 0, 0] [255, 0, 0] [255, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0]
Row 7: [128,128, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [255, 0, 0] [191,191,191] [255,255,255] [ 0, 0, 0] [255,255,255] [191,191,191] [255, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0]
Row 8: [128,128, 0] [127,127,127] [ 0, 0, 0] [255, 0, 0] [191,191,191] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [191,191,191] [255, 0, 0] [ 0, 0, 0] [127,127,127] [128,128, 0]
Row 9: [128,128, 0] [ 0, 0, 0] [255, 0, 0] [255, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255, 0, 0] [255, 0, 0] [ 0, 0, 0] [128,128, 0]
Row 10: [128,128, 0] [ 0, 0, 0] [255, 0, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [ 0, 0, 0] [ 0, 0, 0] [255, 0, 0] [ 0, 0, 0] [128,128, 0]
Row 11: [128,128, 0] [ 0, 0, 0] [255, 0, 0] [255, 0, 0] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255, 0, 0] [255, 0, 0] [ 0, 0, 0] [128,128, 0]
Row 12: [128,128, 0] [127,127,127] [ 0, 0, 0] [255, 0, 0] [191,191,191] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [191,191,191] [255, 0, 0] [ 0, 0, 0] [127,127,127] [128,128, 0]
Row 13: [128,128, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [255, 0, 0] [191,191,191] [255,255,255] [ 0, 0, 0] [255,255,255] [191,191,191] [255, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0]
Row 14: [128,128, 0] [128,128, 0] [128, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [255, 0, 0] [ 0, 0, 0] [255, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128, 0, 0] [128,128, 0] [128,128, 0]
Row 15: [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [128, 0, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0]
从上面的解析结果可以获取到图片的bitCount为4 ,即1个byte可以表示2个像素. 那么从最后的图像数据可以验证,最后打印的RGB值是否正确. 这里要特别注意 注意BMP图像通常从底部开始存储.
因为BMP图像是从底部开始存储的,那么最后一个行对应的原始图像数据为:
30 01 30 00 00 31 00 33
上面其实为颜色的索引,因为每个byte对应2个像素,所以分开后为
0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01 0x00 0x00 0x03 0x00
这里最后一个0x00是要舍弃的,因为图像的宽度是15.
因为颜色表如下,结合上面的索引即可得到真实的RGB信息.
[000] RGB( 0, 0, 0) - Raw: (00 00 00 00)
[001] RGB(128, 0, 0) - Raw: (00 00 80 00)
[002] RGB( 0, 128, 0) - Raw: (00 80 00 00)
[003] RGB(128, 128, 0) - Raw: (00 80 80 00)
[004] RGB( 0, 0, 128) - Raw: (80 00 00 00)
[005] RGB(128, 0, 128) - Raw: (80 00 80 00)
[006] RGB( 0, 128, 128) - Raw: (80 80 00 00)
[007] RGB(127, 127, 127) - Raw: (7f 7f 7f 00)
[008] RGB(191, 191, 191) - Raw: (bf bf bf 00)
[009] RGB(255, 0, 0) - Raw: (00 00 ff 00)
[010] RGB( 0, 255, 0) - Raw: (00 ff 00 00)
[011] RGB(255, 255, 0) - Raw: (00 ff ff 00)
[012] RGB( 0, 0, 255) - Raw: (ff 00 00 00)
[013] RGB(255, 0, 255) - Raw: (ff 00 ff 00)
[014] RGB( 0, 255, 255) - Raw: (ff ff 00 00)
[015] RGB(255, 255, 255) - Raw: (ff ff ff 00)
所以最后一行的RGB数据
Row 15: [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [128, 0, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0]
4.2 实验2(分辨率16x16)
下面是另外一个位图的信息(16x16),这是为了和上面对比的
-
原始图像:
这是一本打开的书籍

-
windows图像属性
可以看到图像分辨率为16x16,实际大小为246 bytes , 注意这里能看到,虽然分辨率比上面的实验大,但是它俩的数据大小是一样的. 这是因为,在15x16分辨率下,因为最后一列的像素虽然是4bit的数据,但是它也占用1个字节的空间,因而大小和16x16图像的大小是一样的.

-
解析结果:
--- 开始解析 BMP 文件: .\Icons\BookOpen.bmp ---
--- BMP File Header (文件头) ---
Signature (文件标识): BM (b'BM')
File Size (文件大小): 246 bytes (0xf6)
Reserved1 (保留字段1): 0 (0x0)
Reserved2 (保留字段2): 0 (0x0)
Data Offset (数据偏移): 118 bytes (0x76)--- BMP Info Header (信息头) ---
Header Size (信息头大小): 40 bytes (0x28)
Width (图像宽度): 16 pixels
Height (图像高度): 16 pixels
Planes (颜色平面): 1
Bits Per Pixel (位深度): 4 bit(s)
Compression (压缩方式): BI_RGB (不压缩)
Image Size (图像数据大小): 128 bytes (0表示未压缩或需计算)
X Pixels Per Meter (水平分辨率): 2850 ppm
Y Pixels Per Meter (垂直分辨率): 2850 ppm
Colors Used (使用颜色数): 16
Important Colors (重要颜色数): 16--- BMP Color Palette (颜色表) ---
预期颜色表项数 (根据位深): 16
实际颜色表项数 (由Header指定): 16
[000] RGB( 0, 0, 0) - Raw: (00 00 00 00)
[001] RGB(128, 0, 0) - Raw: (00 00 80 00)
[002] RGB( 0, 128, 0) - Raw: (00 80 00 00)
[003] RGB(128, 128, 0) - Raw: (00 80 80 00)
[004] RGB( 0, 0, 128) - Raw: (80 00 00 00)
[005] RGB(128, 0, 128) - Raw: (80 00 80 00)
[006] RGB( 0, 128, 128) - Raw: (80 80 00 00)
[007] RGB(127, 127, 127) - Raw: (7f 7f 7f 00)
[008] RGB(191, 191, 191) - Raw: (bf bf bf 00)
[009] RGB(255, 0, 0) - Raw: (00 00 ff 00)
[010] RGB( 0, 255, 0) - Raw: (00 ff 00 00)
[011] RGB(255, 255, 0) - Raw: (00 ff ff 00)
[012] RGB( 0, 0, 255) - Raw: (ff 00 00 00)
[013] RGB(255, 0, 255) - Raw: (ff 00 ff 00)
[014] RGB( 0, 255, 255) - Raw: (ff ff 00 00)
[015] RGB(255, 255, 255) - Raw: (ff ff ff 00)--- BMP Bitmap Data (位图数据) ---
当前文件指针位置: 118 bytes
声明的数据偏移量: 118 bytes
文件指针已位于位图数据起始处。
剩余待读取数据大小: 128 bytes
计算的扫描线大小 (含填充): 8 bytes
计算的总数据大小: 128 bytes数据内容 (按每行16个字节显示): 00000076: 33 33 33 33 33 33 33 33 33 33 33 3c 0c 33 33 33 | b'33333333333<\x0c333' 00000086: 33 33 3c c0 f0 c3 33 33 33 33 c7 0f 0f 0c 33 33 | b'33<\xc0\xf0\xc33333\xc7\x0f\x0f\x0c33' 00000096: 33 3c 00 ff f0 f0 c3 33 3c c0 ff ff ff 0f 0c 33 | b'3<\x00\xff\xf0\xf0\xc33<\xc0\xff\xff\xff\x0f\x0c3' 000000a6: c7 0f 0f ff ff f0 f0 c3 00 ff f0 ff ff ff 0f 0c | b'\xc7\x0f\x0f\xff\xff\xf0\xf0\xc3\x00\xff\xf0\xff\xff\xff\x0f\x0c' 000000b6: 0f ff ff 0f ff ff f0 f0 30 ff ff f0 ff ff ff 03 | b'\x0f\xff\xff\x0f\xff\xff\xf0\xf00\xff\xff\xf0\xff\xff\xff\x03' 000000c6: 33 0f ff ff 0f ff 00 33 33 30 ff ff f0 00 33 33 | b'3\x0f\xff\xff\x0f\xff\x00330\xff\xff\xf0\x0033' 000000d6: 33 33 0f ff 03 33 33 33 33 33 30 00 33 33 33 33 | b'33\x0f\xff\x03333330\x003333' 000000e6: 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | b'3333333333333333'--- BMP Decoded Pixels (解码后的像素) ---
使用颜色表解析 16x16 像素数据...
总共解析出 256 个像素索引。
按 16x16 布局打印 (注意BMP图像通常从底部开始存储):
Row 0: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 1: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 2: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 3: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 4: [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 5: [128,128, 0] [128,128, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [ 0, 0, 0] [128,128, 0] [128,128, 0]
Row 6: [128,128, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [128,128, 0]
Row 7: [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0]
Row 8: [ 0, 0, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255]
Row 9: [ 0, 0,255] [127,127,127] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0]
Row 10: [128,128, 0] [ 0, 0,255] [ 0, 0,255] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0] [128,128, 0]
Row 11: [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0,255] [ 0, 0, 0] [ 0, 0, 0] [255,255,255] [255,255,255] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0] [128,128, 0] [128,128, 0]
Row 12: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0,255] [127,127,127] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 13: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0,255] [ 0, 0,255] [ 0, 0, 0] [255,255,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 14: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [ 0, 0,255] [ 0, 0, 0] [ 0, 0,255] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]
Row 15: [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0] [128,128, 0]