我们合作写一个程序,我朋友是用VC写,我用delphi,我主要是写dll。现在我朋友用VC把一张bmp的图放在内存传入给我的delphi的DLL程序使用,请问delphi如何读取内存中的bmp图,并放在Timage中?

解决方案 »

  1.   

    MS.Position:=0; 
    image1.Picture.Bitmap.LoadFromStream(MS);MS是你读的内存流!
      

  2.   

    从dll传出bitmap.handle (HBitmap类型)试试
    然后image.picture.bitmap.handle:=dll传出的handle.
    这次方式我在写activex组件时经常用到。
      

  3.   

    extern "C" bool __stdcall SetBitmapData(void *data,size_t datasize);function SetBitmapData(data: Pointer;datasize: LongWord): boolean; stdcall;
    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;
      

  4.   

    function SetBitmapData(data: Pointer;datasize: LongWord): boolean; stdcall;
    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;
      

  5.   

    传递位图句柄
    如果是传递的内存数据指针的话
    就使用流来处理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;
      

  6.   

    贴个带色的
    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
      

  7.   

    谢谢!正在研究中!bitmapMem.Seek(0,soFromBeginning);和bitmapMem.Position :=0;有什么区别啊?可以互用吗?还有就是我不知道读取多长的datasize内存内容。因为对方给的是bmp的文件流在内存中,是否要用程序来读取bmp的头文件再来读取此bmp文件的长度,转而计算读取内存的长度。好像有点复杂!
      

  8.   

    Function OCR (data:Pointer):Pchar; stdcall ;
    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;
      

  9.   

    data是一个指针,指向一个内存块,即存的是内存块的首地址,而data^则是内存块的首地址。
    之所以这里需要data^,是由WriteBuffer这个过程内部约定的。
      

  10.   

    以下为delphi写的DLL文档!
    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的函数的定义如何写? 
      

  11.   

     而符号^有两个目标,   
      当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针;   
      当它出现在指针变量后边时   如 point^ 返回指针指向的变量的值; 
      

  12.   

    以下为delphi写的DLL文档! 
    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的函数的定义如何写?