拓展任务
- 先通过搜索引擎了解bmp或png⽂件数据格式的特征
- 再⽤截图⼯具截⼀幅8×8⼤⼩纯⽩⾊的bmp/png图⽚
- 然后⽤⼆进制编辑器观察bmp或png图⽚⽂件数据的规律
- 重复上述步骤,摸清规律后,在⽩底上⽤⿊⾊线条「画」出字⺟「C」
bmp
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
png
透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
格式是无损数据压缩的,可为灰度图和真彩色图添加α通道。
PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道(32-24=8),即
RGB+alpha,因此可展现256级透明程度。
截图裁剪8×8的纯白色图片
上面是纯白色的png图片,可以先截一个合适大小的图,再裁剪为分辨率为8×8的图片。
bmp文件位图信息头:
地址偏移 | 大小 | 作用 |
---|---|---|
0000h | 2 bytes | 说明文件的类型 |
0002h | 4 bytes | 该位图文件的大小,用字节为单位 |
0006h | 2 bytes | 保留必须设置为0 |
0008h | 2 bytes | 保留必须设置为0 |
000Ah | 4 bytes | 说明从文件头开始到实际的图像数据之间的字节偏移量 |
000Eh | 4 bytes | BITMAPINFOHEADER结构所需字数 |
0012h | 4 bytes | 图像的宽度 |
0016h | 4 bytes | 图像的高度 |
001Ah | 2 bytes | 为目标设备说明颜色平面数,其值将总是被设为1 |
001Ch | 2 bytes | 说明比特数/像素,其值为1,4,8,16,24或32 |
001Eh | 4 bytes | 说明图像数据压缩的类型 |
0022h | 4 bytes | 说明图像的大小 |
0026h | 4 bytes | 说明水平分辨率 |
002Ah | 4 bytes | 说明垂直分辨率 |
002Eh | 4 bytes | 说明位图实际使用的彩色表中的颜色索引数 |
0032h | 4 bytes | 说明对图像显示有重要影响的颜色索引的数目如果是0,表示都重要 |
下面的数据就是调色板了。调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。
用二进制编辑器打开bmp图片文件
png数据格式
png文件格式的详解:https://blog.csdn.net/weixin_42045038/article/details/82818435
运用opencv在纯白色8×8的png图片上画出“C”
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,由python语言编写。
本实验用到:Pycharm集成软件,一张8×8纯白色png图片
可以在pycharm中点击File->settings->Project:name->Project Interpreter中添加opencv这个包
根据8×8的分辨率,绘制修改草图:
利用opencv修改数据,代码如下
import cv2
#读取图片imread('文件名',读取方式)
img = cv2.imread('1234.png', cv2.IMREAD_UNCHANGED)
"""
cv2.IMREAD_COLOR # :1 加载一个彩色图像,图像的任何透明度都将被忽略。这是默认标志
cv2.IMREAD_GRAYSCALE # :0 以灰度模式 (grayscale mode) 加载图像
cv2.IMREAD_UNCHANGED # :-1 加载图像,包括alpha channel (透明通道)
"""
#绘制“C”的图案
for i in range(2,6):
img[1, i] = [0, 0, 0]
img[6, i] = [0, 0, 0]
for i in range(2,6):
img[i,2]=[0,0,0]
img[2,5]=[0,0,0]
img[5,5]=[0,0,0]
#保存图片,imwrite('输出文件名',图片矩阵信息)
cv2.imwrite("12345.png", img)
key = cv2.waitKey(0)
print(key)
#销毁窗口
cv2.destroyAllWindows()
运行结果:
原1234.png的图像显示:
修改后12345.png的图像显示: