感觉 错误在于 位图数据结构理解上
位图要求每个扫描行都是 4 个字节的整数倍,
你将位图载入一个3维数组,但是没有处理中的每个扫描行的凑整的数据,然后就造成这种情况。
说实在的,这样载入的位图数据,我都不知如何下手去修改。
要么你整好个图像宽为 4的倍数宽。再去测试你的程序,就知道是不是这个原因。
---
我是使用 PropertyBag
对象去读取 位图数据,会带一个 PropertyBag 数据头,然后得到的数据,
如果原图是BMP,得到的就是BMP数据,然后分析数据,计算每个扫描行的起始元素再使用循环去填充。
当原图不是BMP的,那就先复制一份,得到的就是BMP格式了。
分析代码,目前不知扔哪里去了,用于前面一个贴子 躲避球 的小游戏多线程 代码中,因为那个框架不是我的,所以也没发代码。
目前没兴趣重写了。
BMP文件头定义,使用 PropertyBag 导出的位图数据也使用这个文件头。
程序代码:
Public Type BMP文件头结构类型
文件类型标识 As String * 2 '二字节长,只能为BM
文件长度 As Long '文件长度,4字节
保留字1 As Integer '系统保留,2字节,只能为0
保留字2 As Integer '系统保留,2字节,只能为0
数据起始位置 As Long '数据起始位置,相对数据头
End Type
Public Type BMP文件颜色表类型
蓝 As Byte
绿 As Byte
红 As Byte
保留 As Byte
End Type
Public Type BMP文件位图信息头类型
本结构长度 As Long '本结构的长度,包含颜色表的
图像宽 As Long '图像宽
图像高 As Long '图像高
目标设备级别 As Integer '目标设备级别,只能为1
色彩位数 As Integer '每像素色彩位数,只能为1(双色),4(16色),8(256色),24(真彩) 四种
压缩 As Long '是否是压缩的,必须是 0(不压缩), 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
位图大小 As Long '位图数据区的大小
位图水平分辨率 As Long '位图水平分辨率,每米像素数,好像可以为零
位图垂直分辨率 As Long '位图垂直分辨率,每米像素数,好像可以为零
使用的颜色数 As Long '位图实际使用的颜色表中的颜色数
重要的颜色数 As Long '位图显示过程中重要的颜色数
' 颜色表() as BMP文件颜色表类型 '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
End Type
Public Type BMP扫描行类型
X() As Byte
空() As Byte
End Type
Public Type BMP文件类型
文件标识 As BMP文件头结构类型
位图信息 As BMP文件位图信息头类型
颜色表() As BMP文件颜色表类型 '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
数据() As BMP扫描行类型 '位图数据
End Type