关于位图写入文件的问题(100)

  • 主题发起人 主题发起人 wangmao
  • 开始时间 开始时间
W

wangmao

Unregistered / Unconfirmed
GUEST, unregistred user!
从一个通信动态库取得一个值,该类型为pchar,其值为BM},是一个位图要将读取的值写入bmp文件或存为bmp文件怎么做
 
procedure SaveBmpFile(buf:PChar;bufSize:Integer);var MS:TMemoryStream;begin MS:=TMemoryStream.Create; try MS.WriteBuffer(buf^,bufSize); MS.SaveToFile('c:/1.bmp'); finally MS.Free; end;end;
 
varBmpFileHeader:^BmpMapFileHeader;begin BmpFileHeader=@(buf^); SaveBmpFile(buf,BmpFileHeader.bfSize);end;用上面的方法调用,结果出现stream write error另外,如何使取得一个位图数据,使其返回值为pchar谢谢
 
乱写自然是错误。
 
那怎么调用,我对指针不熟悉
 
我很想知道你从通信动态库里取到的到底是什么数据,如果是位图数据,但是你不知道位图大小的话,你应该用PBitmapFileHeader(buf)^.bfSize得到位图大小,你可以用SaveBmpFile(buf,PBitmapFileHeader(buf)^.bfSize)来保存位图
 
通讯中间库获取的是位图数据,文档Vc:5. char* ExtractDiffInBitmap() 说明:解析出位图形式的DIFF散点图; 入参:无; 出参:无; 返回:当仪器端通信设置中的散点图数据类型选项设为二进制数据时,返回值为空,当散点图数据类型设为位图时,将返回位图形式的DIFF散点图,格式为位图文件数据;用BITMAPFILEHEADER(可参见MSDN)结构解析位图头部数据可获取位图大小。例如:char *DiffResource = ExtractDiffInBitmap(); //解析出位图形式的DIFF散点图 BITMAPFILEHEADER* pDiffHeader = (BITMAPFILEHEADER*) DiffResource;int DiffSize = pDiffHeader->bfSize; //获得位图的大小file.open("D://Diff.bmp"); file.write(DiffResource, DiffSize); //将获取到的位图保存到名为“Diff.bmp”的文件中file.close();delphi 文档5. function ExtractDiffInBitmap():pchar ;说明:解析出位图形式的DIFF散点图; 入参:无; 出参:无;返回:当仪器端通信设置中的散点图数据类型选项设为二进制数据时,返回值为空,当散点图数据类型设为位图时,将返回位图形式的DIFF散点图,格式为位图文件数据;用BITMAPFILEHEADER(可参见Delphi Widows sdk帮助)结构解析位图头部数据可获取位图大小。例如:varpDiffHeader : ^BITMAPFILEHEADER;cDiffInBit : pchar;cDiffInBit := ExtractDiffInBitmap();pDiffHeader := @(cDiffInBit^); pDiffHeader->bfSize; { 这个就是散点图的大小 }delphi里这样写肯定有点问题,有点像c++ builder 的写法现在是想将ExtractDiffInBitmap()返回的值存为bmp文件这个ExtractDiffInBitmap()通过仪器返回的值是'BM}'而且返回值类型是pchar要将这个值存为bmp文件
 
varpDiffHeader : ^BITMAPFILEHEADER;cDiffInBit : pchar;m_FS: TFileStream;begincDiffInBit := ExtractDiffInBitmap();if(cDiffInBit <> nil)beginpDiffHeader := @(cDiffInBit^);m_FS:= TFileStream.Create('tmp.bmp');m_FS.WriteBuffer(cDiffInBit, pDiffHeader.bfSize);m_FS.Close();end;
 
另外,如果不接仪器,指定一张bmp图片,然后使其返回值如通信中间库一样,返回图片数据的 pchar类型?
 
...procedure SaveBmpFile(buf:PChar;bufSize:Integer);var MS:TMemoryStream;begin MS:=TMemoryStream.Create; try MS.WriteBuffer(buf^,bufSize); MS.SaveToFile('c:/2.bmp'); finally MS.Free; end;end;procedure TForm1.Button1Click(Sender: TObject);var MS:TMemoryStream; Bmp:TBitmap; buf:PChar;begin Bmp:=TBitmap.Create; try Bmp.LoadFromFile('c:/1.bmp'); MS:=TMemoryStream.Create; try Bmp.SaveToStream(MS); MS.Position:=0; buf:=PChar(MS.Memory);//相当于你从通信动态库里取到的数据 SaveBmpFile(buf,PBitmapFileHeader(buf)^.bfSize); finally MS.Free; end; finally Bmp.Free; end;end;
 
wangdonghai 不过我今天试了下,导入一张图片好像没有问题但是用演示数据出错了,因为演示数据获取的值除了'BM}'后面有一串乱七八糟的字符那些字符是在一个文件里头的,我用编辑器打开,拷贝来发送的,不知道是不是这个原因才造成错误,还是其它原因?
 
多人接受答案了。
 
wangdonghai : 你的方法我方式过了,成功了dark_power:你的方法有问题,不过谢谢作答
 
后退
顶部