有几天没上,所以耽误了一下,琪是我原来做过直接读文件数据来获取数据的程序,后来发现有点麻烦,
而且找到了用scanline的方法,所以就改了。但是既然你要,我就吧我原来的方法以贴出来参考:
定义类型:
type
Theader=record
Fileheader:bitmapfileheader; //关于该类型定义按F1 delphi有说明,其实就是你开始的定义
infoHeader:bitmapinfoheader; //
end;
var
f1:file; //用于读数据;
f2:file of Theader; //用于读文件头;
myheader:Theader;
先读文件头到myheader:
assignfile(f2,$yourfilename);
reset(f2);
read(f2,myheader);
closefile(f2);
然后可根据myheader定义数组大小,或者直接定义一个1024*1024的二维数组,应该够了吧?
在读数据:
assignfile(f1,$yourfilename);
reset(f1,1); //参数跟前面是有区别的;
seek(f1,myheader.fileheader.bfOffBits); //定位到数据偏移处;
{计算每行字节数,这个比较复杂,还好当时求出了通解;}
Lwidth:=((myheader.infoheader.biWidth*myheader.infoheader.biBitCount+31) div 32)*4;
for i :=0 to header.infoHeader.biHeight-1 do
blockread(f1,Rdata,xxx); //按每一行按字节读数据
下面就是数据拆分了,最麻烦,我就不写程序了,写写基本原理:
1。 每一行的数据字节数必须要能被4整除,不足的补零;
2。 2色的一个二进制位可以表示一个像素,一个字节就有8个象素的数据;
16色的4个二进制位一个像素,一个字节有2个象素的数据;
256色最方便,一个字节一个象素数据;
24位真彩色的是4个字节一个象素数据,好像是g,b,r,00,最后一个00位保留字节。
3。以上所说的数据都是指在调色板里的索引值,除了24位真彩色,因为它没有调色板。
你需要做得就是根据颜色数,按字节拆分象素值。