拓展任务
先通过搜索引擎了解bmp⽂件数据格式的特征
再⽤截图⼯具截⼀幅8×8⼤⼩纯⽩⾊的bmp图⽚
然后⽤⼆进制编辑器观察bmp图⽚⽂件数据的规律
重复上述步骤,摸清规律后,在⽩底上⽤⿊⾊线条「画」出字⺟「C」
使用QQ截图工具,截取一张8x8的bmp格式图片,
用Hex Editor Neo打开 "8x8纯白.bmp",可以看到这个文件的全部数据如下图所示:
1
1.位图文件头(BITMAPFILEHEADER)
位图文件头分4部分,共14字节: 名称 | 占用空间 | 内容 | 实际数据 | bfType | 2字节 | 标识,就是“BM”二字 | BM | bfSize | 4字节 | 整个BMP文件的大小 | 0x00000136(310)【与右键查看图片属性里面的大小值一样】 | bfReserved1/2 | 4字节 | 保留字,没用 | 0 | bfOffBits | 4字节 | 偏移数,即 位图文件头+位图信息头+调色板 的大小 | 0x36(54) |
注意,Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为50 1A 25 3C,倒着念就是3C 25 1A50,即0x3C251A50。因此,如果bfSize的数据为36 01 00 00,实际上就成了0x00000136,也就是0xC00136。
2
2位图信息头(BITMAPINFOHEADER )位图信息头共40字节: 名称 | 占用空间 | 内容 | 实际数据 | biSize | 4字节 | 位图信息头的大小,为40 | 0x28(40) | biWidth | 4字节 | 位图的宽度,单位是像素 | 0x200(512) | biHeight | 4字节 | 位图的高度,单位是像素 | 0x200(512) | biPlanes | 2字节 | 固定值1 | 1 | biBitCount | 2字节 | 每个像素的位数 1-黑白图,4-16色,8-256色,24-真彩色 | 0x18(24) | biCompression | 4字节 | 压缩方式,BI_RGB(0)为不压缩 | 0 | biSizeImage | 4字节 | 位图全部像素占用的字节数,BI_RGB时可设为0 | 0x0C | biXPelsPerMeter | 4字节 | 水平分辨率(像素/米) | 0 | biYPelsPerMeter | 4字节 | 垂直分辨率(像素/米) | 0 | biClrUsed | 4字节 | 位图使用的颜色数 如果为0,则颜色数为2的biBitCount次方 | 0 | biClrImportant | 4字节 | 重要的颜色数,0代表所有颜色都重要 | 0 |
作为真彩色位图,我们主要关心的是biWidth和biHeight这两个数值,两个数值告诉我们图像的尺寸。biSize,biPlanes,biBitCount这几个数值是固定的。想偷懒的话,其它的数值可以一律用0来填充。
3
调色板地址
图像的调色板地址从00000036h开始存储
cat2.bmp图像的调色板地址从00000036h开始到00000135h结束
photoshop中调色板显示为:ff 00 00(分别表示 红 绿 蓝),Hex Editor Neo 中 00 00 ff 00 表示红色,
photoshop中调色板显示为:00 00 ff(分别表示 红 绿 蓝),Hex Editor Neo 中 ff 00 00 00 表示蓝色。两者刚好是倒过来的。
如下图所示
5
用绿色画一个C字
将16进制全部复制到文本编辑器里面,按8x8像素排列好,进行修改。
根据前面的试验结果,ff ff ff ff 修改为00 ff 00 ff就可以变为绿色
完结
from:https://blog.csdn.net/aidem_brown/article/details/80500637
⾃测
1101 0101 0001转⼗六进制是多少?有什么最快的计算⽅法能得到结果?
解答:
每四位表示一个十六进制,答案是b51
101011.101011对应的⼗进制数是多少?
解答:
整数部分:1*2^5+0*2^4+1*2^3+0*2^2+1*2^1+1*2^0=43
小数点后:1*2^-1+0*2^-2+1*2^-3+0*2^-4+1*2^-5+1*2^-6 =0.671875
43+0.671875=43.671875
常⻅的⾳频编码格式有哪些?
答:aac,MP3,wma
常⻅的视频编码格式有哪些?
答:H.261、H.262、H.263、H.264、H.265、MPEG
⼀个尺⼨8×8⼤⼩的png全⿊图⽚前四个字节的⼗六进制值是什么?
10001001 01010000 01001110 01000111对应
89 50 4e 47
UTF8三字节的编码⽅式为:1110xxxx 10xxxxxx 10xxxxxx,汉字【中】的Unicode编码⼗六进制值是0x4e2d,Unicode编码
按三字节编码转换到⼗六进制的UTF8编码的计算过程是什么?
答:
4e2d分别是 0100 1110 0010 1101依次填入1110xxxx 10xxxxxx 10xxxxxx(假设是从左到右0-7位)(假设是从左到右 1-3字节)第一个字节4-7位:0100
第二个字节的2-5位:1110
第二个字节6-7位和第三个字节2-3位 :0010
第三个字节4-7位:1101
插入后得到 11100100 10111000 10101101
转换为16进制为:edbaa4
form:https://blog.csdn.net/wangwenan1993/article/details/45559369
解题思路参考如下:
UNICODE uCA(1100 1010) 编码成UTF-8将需要2个字节:
uCA C3 8A, 过程如下:
uCA(1100 1010)处于0080 ~07FF之间,从上文中的转换表可知对其编码需要2bytes,即两个字节,其对应 UTF-8格式为: 110X XXXX 10XX XXXX。从此格式中可以看到,对其编码还需要11位,而uCA(1100 1010)仅有8位,这时需要在其二进制数前补0凑成11位: 000 1100 1010, 依次填入110X XXXX 10XX XXXX的空位中, 即得 1100 0011 1000 1010(C38A)。
同理,UNICODE uF03F (1111 0000 0011 1111) 编码成UTF-8将需要3个字节:
u F03FEF 80 BF,对应格式为:1110XXXX 10XX XXXX 10XX XXXX,编码还需要16位,将1111 0000 0011 1111(F03F)依次填入,可得 1110 1111 1000 0000 1011 1111(EF 80 BF)。
UTF8文件协议里有更详细说明
如果要提供⼀个实时的流媒体服务器,除了ffmpeg,还需要使⽤哪个组件?
答:ffmpeg和ffserver配合使用可以实现实时的流媒体服务。
|