如何使用DELPHI自由读取图象(200分)

  • 主题发起人 主题发起人 tmnet
  • 开始时间 开始时间
T

tmnet

Unregistered / Unconfirmed
GUEST, unregistred user!
因为程序需要,我在程序里需要把数据和图象放在一起,<br>放在一起很简单,但是要正确读取却很难了。我设计了下面的<br>代码,但可惜是错误的。希望各位大侠不吝赐教。<br>&nbsp; &nbsp;写入:<br>fs:=tfilestream.create('d:/m.dat',fmcreate);<br>fs.write('kkllkkll',8);<br>fp:=fileopen('d:/temp.bmp',0);<br>dwsize:=getfilesize(fp,nil);<br>getmem(p,dwsize);<br>fileread(fp,p^,dwsize);<br>fs.write(p^,dwsize);<br>freemem(p);<br>fs.free;<br>&nbsp; &nbsp;读出:<br>fs:=tfilestream.create('d:/m.dat',fmfileopen);<br>fs.read(s,8);<br>bmp:=tbitmap.create;<br>bmp.loadfromstream(fs);<br>form1.canvas.draw(0,0,bmp);<br>bmp.free;<br>fs.free;<br>&nbsp;
 
如果是BMP的话,很简单,因为Bmp图象的文件头的结构大家都比较熟悉,<br>你可以在文件中首先找到Bmp图象标志BM,然后根据文件头中的信息得到文件的大小<br>从而将文件分离出来。<br>下面列出BMP的文件结构,请参阅<br>一、BMP文件结构 <br><br>---- 1. BMP文件组成 <br><br>---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 <br><br>---- 2. BMP文件头 <br><br>---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 <br><br>---- 其结构定义如下: <br><br>typedef struct tagBITMAPFILEHEADER<br>{<br>WORDbfType; &nbsp; // 位图文件的类型,必须为BM<br>DWORD &nbsp; bfSize; &nbsp; // 位图文件的大小,以字节为单位<br>WORDbfReserved1; &nbsp;// 位图文件保留字,必须为0<br>WORDbfReserved2; &nbsp;// 位图文件保留字,必须为0<br>DWORD &nbsp; bfOffBits; // 位图数据的起始位置,以相对于位图<br>// 文件头的偏移量表示,以字节为单位<br>} BITMAPFILEHEADER;<br><br><br>---- 3. 位图信息头 <br>---- <br><br>BMP位图信息头数据用于说明位图的尺寸等信息。<br>typedef struct tagBITMAPINFOHEADER{<br>&nbsp; &nbsp;DWORD &nbsp;biSize; &nbsp; // 本结构所占用字节数<br>&nbsp; &nbsp;LONGbiWidth; &nbsp;// 位图的宽度,以像素为单位<br>&nbsp; &nbsp;LONGbiHeight; // 位图的高度,以像素为单位<br>&nbsp; &nbsp;WORD &nbsp; biPlanes; // 目标设备的级别,必须为1<br>&nbsp; &nbsp;WORD &nbsp; biBitCount// 每个像素所需的位数,必须是1(双色),<br>&nbsp; // 4(16色),8(256色)或24(真彩色)之一<br>&nbsp; &nbsp;DWORD &nbsp;biCompression; &nbsp; // 位图压缩类型,必须是 0(不压缩),<br>&nbsp; // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一<br>&nbsp; &nbsp;DWORD &nbsp;biSizeImage; // 位图的大小,以字节为单位<br>&nbsp; &nbsp;LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数<br>&nbsp; &nbsp;LONGbiYPelsPerMeter; &nbsp;// 位图垂直分辨率,每米像素数<br>&nbsp; &nbsp;DWORD &nbsp;biClrUsed;// 位图实际使用的颜色表中的颜色数<br>&nbsp; &nbsp;DWORD &nbsp;biClrImportant;// 位图显示过程中重要的颜色数<br>} BITMAPINFOHEADER;<br><br><br>---- 4. 颜色表 <br>---- 颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下: <br><br>typedef struct tagRGBQUAD {<br>BYTErgbBlue;// 蓝色的亮度(值范围为0-255)<br>BYTErgbGreen; &nbsp; // 绿色的亮度(值范围为0-255)<br>BYTErgbRed; // 红色的亮度(值范围为0-255)<br>BYTErgbReserved;// 保留,必须为0<br>} RGBQUAD;<br>颜色表中RGBQUAD结构数据的个数有biBitCount来确定:<br>当biBitCount=1,4,8时,分别有2,16,256个表项;<br>当biBitCount=24时,没有颜色表项。<br>&nbsp; &nbsp;位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:<br>typedef struct tagBITMAPINFO {<br>&nbsp; &nbsp;BITMAPINFOHEADER bmiHeader; &nbsp; // 位图信息头<br>&nbsp; &nbsp;RGBQUAD &nbsp;bmiColors[1]; &nbsp;// 颜色表<br>} BITMAPINFO;<br><br><br><br>---- 5. 位图数据 <br>---- 位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数: <br><br>当biBitCount=1时,8个像素占1个字节;<br>当biBitCount=4时,2个像素占1个字节;<br>当biBitCount=8时,1个像素占1个字节;<br>当biBitCount=24时,1个像素占3个字节;<br>Windows规定一个扫描行所占的字节数必须是<br>4的倍数(即以long为单位),不足的以0填充,<br>一个扫描行所占的字节数计算方法:<br>DataSizePerLine= (biWidth* biBitCount+31)/8; <br>&nbsp;// 一个扫描行所占的字节数<br>DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数<br>位图数据的大小(不压缩情况下):<br>DataSize= DataSizePerLine* biHeight;<br><br>
 
将整个文件读取到一个TMemoryStream变量a中,将从第九个字节开始的<br>数据复制到另一个TMemoryStream变量b中。然后是bmp.loadfromstream(b);
 
<br>&nbsp; &nbsp;读出:<br>My1:= TMemoryStream.Create;<br>fs:=tfilestream.create('d:/m.dat',fmfileopen);<br>fs.read(s,8);<br>my1.CopyFrom(fs,0);<br>bmp:=tbitmap.create;<br>bmp.loadfromstream(my1);<br>form1.canvas.draw(0,0,bmp);<br>bmp.free;<br>fs.free;<br>my1.free;
 
多人接受答案了。
 
后退
顶部