1楼和2楼的朋友在跟你开玩笑呢:)BMP文件的格式大致如此:--------------------------------------------------------文件头 'B''M' 2字节(固定为BM) size 4字节(文件的长度,单位byte) 保留 4字节 偏移 4字节 (到位图数据的偏移,单位byte) --------------------------------------------------------图像信息 图像信息头 40字节(sizeof(BITMAPINFOHEADER)) 调色板 不固定 --------------------------------------------------------位图数据 ........ ........ -------------------------------------------------------- 位图数据部分很重要的一点是每行的数据要对齐(原文: each scan line must be padded with zeroes to end on a LONG data-type boundary)。 注:对齐的原因是为了优化操作。你用的是24bit的图像,每行33个像素,每像素3个字节。一行共99个字节,显然是不能以4个字节为单位进行对齐,要补零到4的倍数,也就是100。 这就是为什么你看到一个字节的多余数据。每行,也有人叫每个扫描线,的步长,英文叫Stride,可以通过BitmapData.Stride来获得。 存取操作一般不用(图像宽度*字节每像素*第几行 + ...),而要用(Stride * 第几行 + ...)来进行。要拿到图像数据,比较简单的是用Bitmap.LockBits()来得到一个BitmapData。 你要用ReadBytes也可以。这时可利用“图像信息头”得到图像的大小,色深等信息;利用“偏移”直接跳得图像数据部分; 根据宽度和色深计算出“步长”;然后就可以自己读Bmp文件数据了。
'B''M' 2字节(固定为BM)
size 4字节(文件的长度,单位byte)
保留 4字节
偏移 4字节 (到位图数据的偏移,单位byte)
--------------------------------------------------------图像信息
图像信息头 40字节(sizeof(BITMAPINFOHEADER))
调色板 不固定
--------------------------------------------------------位图数据
........
........
--------------------------------------------------------
位图数据部分很重要的一点是每行的数据要对齐(原文: each scan line must be padded with zeroes to end on a LONG data-type boundary)。
注:对齐的原因是为了优化操作。你用的是24bit的图像,每行33个像素,每像素3个字节。一行共99个字节,显然是不能以4个字节为单位进行对齐,要补零到4的倍数,也就是100。
这就是为什么你看到一个字节的多余数据。每行,也有人叫每个扫描线,的步长,英文叫Stride,可以通过BitmapData.Stride来获得。
存取操作一般不用(图像宽度*字节每像素*第几行 + ...),而要用(Stride * 第几行 + ...)来进行。要拿到图像数据,比较简单的是用Bitmap.LockBits()来得到一个BitmapData。
你要用ReadBytes也可以。这时可利用“图像信息头”得到图像的大小,色深等信息;利用“偏移”直接跳得图像数据部分;
根据宽度和色深计算出“步长”;然后就可以自己读Bmp文件数据了。