BMP文件编辑任务是用二进制编码器画两条直线,一般来说编写简单的任务不是很难。 前提是能做到。 对无情的春天来说,恰恰相反,给了它一个终点,怎么走完全取决于自己。 这个过程称为成长。
1. 首先要了解什么是BMP
BMP是位图格式,不写两种类型。 在网上搜索的话有的是。 我也没想得太深。 任务是自己编辑画线,先找有没有现成的,修好不就行了吗? 我搜索了几次,但是没有。 恐怕太简单了,大咖不屑于分享。 好的,那个自己调查一下吧。 Sogou的词条有说明。 CSDN有个哥哥,可能是叔叔Edison_AI写的文章。 地址是https://blog.csdn.net/yesheng 1989/article/details/11595735。SPM=1001.2014.3001.5506,用于BMP位图的
格式和各数据的作用和确定方法,读了几遍后才明白了一些。 别管被称为“变量名”的英文字母,它和二进制没什么关系,重点是“地址”、“大小”、“说明”。 在刚更改《植物大战僵尸》游戏数据的基础上,对二进制数据有了一点了解,基本上可以理解这个任务是如何完成的。
2. 新建BMP文件
在Windows系统的桌面上单击鼠标右键,然后单击“新建”。 这是一个空白文件。 数据大小为0。 即使在UE中打开,也仍然为空。 怎么和我想的不一样,应该有一串十六进制的数据? 空白怎么做?
应该有什么我没有掌握的操作! Edison_AI大哥写的“位图文件的头”的第一个变量值必须为“BD”,敲击; 回车,第二个变量是什么,2字节,空2格; 回车,第三个变量…… 好吧,这个方向错了。 首先,试着找找能不能找到熟悉的(相对的)十六进制数据。 在UE面板上逐个尝试按钮和工具后,会出现“切换十六进制模式”按钮(参见图2 )。 点击那个,啊……出来了。 有一扇门。
但是数据量这么少,好像不太对。 空间,浪费; 回车里去,没用; 插入,没用。 好像什么方法都不行,但是这个数据在原来的接口上出来了,所以我会回去放空格。 效果出来了。 另外切成十六进制的话会有更多的数据。 干脆多敲点,备用。
3. 开始编辑
迈出了第一步。 还有九十九步。 要去看大神的文章,必须先编辑“位图文件的开头”吧。
编辑“位图文件头”「BM”已经有了。 继续。 bfType是2Bytes,后面的bfSize是4Bytes,要写BMP文件的大小,一共是多少字节? 我不知道,但这四个字节先不动。 请将以下两个变量保留为0,并全部填充0。 最后的bfOffBits写“从文件头0000h到图像像素数据的字节偏移”,但不太清楚。 总之,这4个字节不动。
编辑“位图信息头”虽然不一一写,但是共计11个变量会朝着字节数和地址各编辑一个。 可以确定的东西先更改,不能确定的东西先不动。 图像宽度(biWidth )、图像高度(biHeight )首先写为200和300。 换算成十六进制,后来知道了那个意思,不用说就换成了20和30。
biBitCount也不太理解,写了4。 分辨率全部为2000,之后即使改为200,似乎也没有大的变化。
编辑“BMP调色板”调色板数据仅用于1、4和8位图像,16、24和32位图像不需要调色板数据。 这意味着调色板最多只需要256个项目(索引0到255 )。 上面的biBitCount赋值为4,根据需要这里应该是16色的图像。 也就是说有16种颜色。 每种颜色占用4个字节,需要逐一编辑。 刚开始只是随便填了几组数字,因为不明白大神说的颜色是什么,在后面生成图像后发现什么也看不见,回头想了想这4个字节是怎么用的。
我觉得有图像处理经验的人很容易理解。 我用过PS。 前三个字节分别对应绿、蓝、红三种颜色,为0-255,共计256种灰度。 十六进制数从“00”到“EE”。 考虑到这次的任务很单一,选择了两个调色板,每组选一组分配“EE”,取原色。 第四个字节对应于调色板的透明度。 因为我不能使用,所以是直接给的0。 请强调一下。 一共有16个调色板。 每4个字节,必须避免遗漏或增多。 我采用的初学者策略是首先按调色板增量为第一个字节赋值。 (但是,由于不小心只给了“01”到“FF”,所以少了一组,之后绘图发现了问题。 )然后根据需要逐一调整,这次的任务调整为1 ) 2个即可。
编辑“BMP图像数据区”终于说到正题了。 如果biBitCount=4,则两个像素占用一个字节。 Windows规定,一条扫描线所占的字节数必须为4的倍数,即以长为单位。 不足部分用0填补,一条扫描线所占字节数的计算方法是: datasizeperline=(bi width * bibit其中一个字节对应两个像素,但我们的图像大小为20*30像素。 这没有矛盾吗? 虽然不知道原理,但是通过反复调整(准确地说是8次)来理解。 这16个字节是输入,输出改变了图像大小。 这意味着每行输出20个像素10个字节。 具体流程将在后面一节详细说明。
完善数据结构之前我们在编辑的过程中,对一些不能提前确定的变量进行的处理是空的还是无关的,目前
在数据结构基本完成了,像bfSize(BMP文件的大小)、bfOffBits(从文件头0000h开始到图像像素数据的字节偏移量)、biSize(BMP信息头大小)都明确了,需要给予完善。
画线。这是任务理论上的最后一步,发挥一下空间相像能力,也可以拿个表格提前构想一下。原理是一行一行扫描输出,从下往上,构成一幅图,那要想画横线,把一个扫描行都给安排上就有了;要想画竖线,把每个扫描行的同一列安排上,也就行了。我想斜线,事实证明做难事必有所得,果不其然,我又多学到了,就是关于最后的图片里一行有几个像素的知识。
4. 调整数据
第一次,我按照一个扫描行16字节,第1行给位于第一列的字节赋值,其他为0;第1行给位于第二列的字节赋值,其他为0;依此类推,到第16行。然后在后面的14行里也按这个安排用另一颜色划了第二条斜线,满怀期待的保存,改文件名(备份,去掉“.bak”)、打开文件(见图3)。
这个图片小得可怜,但是确实是亲生的,放大勉强看吧,毕竟200 * 300像素的图片数据量在那摆着呢。
更重要的是线不成线,肯定不对,深思之后决定调整数据行宽为14(计算得到的真实值应该是14),结果依然不成线,再改成10(设置的图片宽度为20像素,10字节),终于有点像了,再经过一些调整,得到了最终的图片(这里本来要上图的,但是不知为何传上来的图片显示有位移,就不研究了),一红一绿2条斜线。
颜色问题和漏掉1个调色板的问题都是在反复调整数据过程中发现和纠正的,事实证明实践出真知,到此,我越发觉得这种学习方式非常有效,尽管会在一定程度上降低效率,但是一旦成功,效果非常显著,一个个任务做下来,应该能取得不小的进步。