我们合作写一个程序,我朋友是用VC写,我用delphi,我主要是写dll。现在我朋友用VC把一张bmp的图放在内存传入给我的delphi的DLL程序使用,请问delphi如何读取内存中的bmp图,并放在Timage中?
解决方案 »
- 急求解:怎样让richedit不要把一行最后放不下的单词移动到下行显示
- Delphi7做客户端java做服务端,webservice问题???
- ADOconnection 问题!
- EML文件分析,里面的邮件时间怎么分析和提取,做邮件得高手指教!
- D8印象
- 兄弟我的论坛开了,大家支持一下啊!![为了感谢,特散分]
- 日期查询问题
- 请问怎样调试“statement expected but 'procedure' found”?
- 怎么把接口中的事件引出来?InterfaceConnect完后该怎么做?
- 动态菜单
- 按键精灵跟简单游的脚本可以实现==比较游戏的血条==来模拟按键, 请问Delphi 怎么实现比较
- Delphi查找重复字符串,不是指定的字符串,是要把所有的字符串都互相比较看有没有重复的
image1.Picture.Bitmap.LoadFromStream(MS);MS是你读的内存流!
然后image.picture.bitmap.handle:=dll传出的handle.
这次方式我在写activex组件时经常用到。
var
bitmapMem: TMemoryStream;
begin
Result := false;
bitmapMem := TMemoryStream.Create;
try
try
bitmapMem.WriteBuffer(data, datasize);
bitmapMem.Seek(0,soFromBeginning);
Image1.LoadFromStream(bitmapMem);
Result := true;
except
end;
finally
bitmapMem.Free;
end;
end;exports
SetBitmapData;
var
bitmapMem: TMemoryStream;
bmpImg: TBitmap;
begin
Result := false;
bitmapMem := TMemoryStream.Create;
try
try
bitmapMem.WriteBuffer(data, datasize);
bitmapMem.Seek(0,soFromBeginning);
bmpImg := TBitmap.Create;
try
bmpImg.LoadFromStream(bitmapMem);
Image1.Picture.Assign(bmpImg); (*Image1: TImage*)
Result := true;
finally
bmpImg.Free;
end;
except
end;
finally
bitmapMem.Free;
end;
end;
如果是传递的内存数据指针的话
就使用流来处理procedure BmpHexToBmp(const HexStr: string;bmp: TBitmap);
var
Stream: TMemoryStream;
begin
if bmp = nil then
raise Exception.Create('位图不能为空');
Stream := TMemoryStream.Create;
Stream.SetSize(Length(HexStr)div 2);
Classes.HexToBin(Pchar(HexStr),Pchar(Integer(Stream.Memory)),Stream.Size);
Stream.Seek(0,soFromBeginning);
bmp.LoadFromStream(Stream);
Stream.Free;
end;
procedure BmpHexToBmp(const HexStr: string;bmp: TBitmap);
var
Stream: TMemoryStream;
begin
if bmp = nil then
raise Exception.Create('位图不能为空');
Stream := TMemoryStream.Create;
Stream.SetSize(Length(HexStr)div 2);
Classes.HexToBin(Pchar(HexStr),Pchar(Integer(Stream.Memory)),Stream.Size);
Stream.Seek(0,soFromBeginning);
bmp.LoadFromStream(Stream);
Stream.Free;
end; 具体帖子请看:
关于图像到16进制相互转换的几个函数
http://www.52delphi.com/dispbbs.asp?boardid=21&Id=74
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(data^,5454);//这里是用data^来调用buffer信息,如果直接用data会读出另外的一些内存的内容。为什么会这样!data和data^有何区别?5454是固定的bmp图的长度。
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);//bitmapMem.SaveToFile('tmp.bmp');此为测试读取的图片是否成功
bitmapMem.Free;
Result:=Pchar(BmpToStr(Image));
finally
Image.free;
end;
except
Result:='F';
end;end;
之所以这里需要data^,是由WriteBuffer这个过程内部约定的。
Function OCR (data:Pointer):Pchar; stdcall ;
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(data^,5454);
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);
bitmapMem.Free;
Result:=Pchar(BmpToStr(Image));
finally
Image.free;
end;
except
Result:='F';
end;
end;我用delphi写DLL寄主程序来进行调试的Dll调用源码!
Function OCR (data:Pointer):Pchar; stdcall ; external 'LJOCR.dll' ;
可以成功调用!
可是c如何直接调用这个dll的函数,c的函数的定义如何写?
当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针;
当它出现在指针变量后边时 如 point^ 返回指针指向的变量的值;
Function OCR (data:Pointer):Pchar; stdcall ;
var
Image: TBITMAP;
bitmapMem: TMemoryStream;
begin
bitmapMem:= TMemoryStream.Create;
try
bitmapMem.WriteBuffer(data^,5454);
bitmapMem.Position:=0;
Image:=TBITMAP.Create;
try
Image.LoadFromStream(bitmapMem);
bitmapMem.Free;
Result:=Pchar(BmpToStr(Image));
finally
Image.free;
end;
except
Result:='F';
end;
end; 我用delphi写DLL寄主程序来进行调试的Dll调用源码!
Function OCR (data:Pointer):Pchar; stdcall ; external 'LJOCR.dll' ;
可以成功调用!
可是c如何直接调用这个dll的函数,c的函数的定义如何写?