请问VC的BMP图,如何通过内存的方式给DELPHI加载(300分)

  • 主题发起人 主题发起人 popi
  • 开始时间 开始时间
P

popi

Unregistered / Unconfirmed
GUEST, unregistred user!
请问VC解析出的BMP类型的图, 如何通过内存的方式(如内存映射)给DELPHI的TBitmap加载?

以前是VC直接存成BMP文件,后delphi再load进TBITMAP,但速度太慢了,需要改成内存模式,不知道如何操作, 两个语言关于BMP肯定内存不一样的

急, 困惑了好多天, 不知道如何操作,请大虾们指教,或给点建议.
 
其实楼主的问题很广泛:
真的慢吗?
硬盘中间文件操作慢吗? 你的图片多大(包括色位数)? 中间文件多大?
估计是你的消息机制问题吧: VC保存完中间文件后, 如何让delphi程序立即知道的? // 这才是速度的关键问题
用内存来在两个程序(进程)之间交换当然是最快的, 方法也有几种:
1. 使用内存映射文件共享; // 专门的资料网上也能找到的;
2. 使用系统的剪贴板; // 也不是很难的;
3. 使用本机进程间的sokcet/tcp通讯; //速度也是很快的, 但编程稍微复杂一点点;
4. DLL内存块的共享; // 稍微复杂一点;
 
我想楼主的意思是想,每秒钟实现几十张,甚至更多的位图传递吧。
其实,位图对象的数据存储,在Delphi里面和VC里面都是一样的,只是操作他们的类不相同,不过,两个应用程序之间无法直接共享,
建议还是用内存映射文件吧。每秒几十张,应该没有问题吧。

至于存储的数据格式,请你参考Delphi里面的TBitmap.SaveToStream
你这样,在VC里面实现这个方法,这样就可以了,
 
用剪贴板,或者内存映射
//---------------接收-----------
var
MapPointer:Pointer;
begin
if (OpenFileMapping(FILE_MAP_ALL_ACCESS,False,'MapFileDemo')<>0) then
begin
MapPointer:=MapViewofFile(OpenFileMapping(FILE_MAP_ALL_ACCESS,False,'MapFileDemo'),FILE_MAP_ALL_ACCESS,0,0,0);
把MapPointer指向的内容读入Bitmap
end;
end

//---------------发送-------------------
begin
MapFilehwnd:=CreateFileMapping($FFFFFFFF,NIL,Page_ReadWrite,0,10000,'MapFileDemo'); //得到映射文件句柄
if MapFilehwnd<>0 then
begin
MapFilePointer:=MapViewOfFile(MapFilehwnd,FILE_MAP_ALL_ACCESS,0,0,0); //映射整个文件到地址空间。
//拷贝Bitbmp的内容到内存映射文件对象
end;
end;
 
后退
顶部