如何取得图片的内存地址(100分)

  • 主题发起人 主题发起人 vikingmao
  • 开始时间 开始时间
V

vikingmao

Unregistered / Unconfirmed
GUEST, unregistred user!
已经有了一个bitmap(TBitmap)从Image1里边复制的,问一个
p(Pointer)=@bitmap能不能算作是这个图片的首地址呀?
因为要调用vc的一个dll函数,所以需要传递它的内存地址和高度、长度
高度长度我知道bitmap.height 和bitmap.width可以的
请试过的人指点一二,谢了
 
1.显然@Bitmap不是图片的首地址,而是Bitmap这个类实例的地址.
2.我是用以下方法:
var
Bitmap:TBitmap;
Stream:TMemoryStream;
P:Pointer;
......
Stream:=TMemoryStream.Create;
Bitmap.Width:=100; Bitmap.Height:=100;
Bitmap.SaveToStream(Stream);
P:=Stream.Memory;
end;
P就是Bitmap的数据地址
 
谢谢,不过我的dll还没有拿到,否则试过有用的话马上把分加给你:)
 
@bitmap.scanlines[0]不是吗?
 
to winion:
bitmap.scanlines[0]本身就是一个指针,它指向TBitmap的第0行的第0个象素,
@bitmap.scanlines[0]是bitmap.scanlines[0]指针的地址.
另外,
我估计vikingmao要的是整个的图片的数据地址,而不只是图片象素点的地址.
一个Bitmap包括:
图片基本信息,调色版(选),象素点数据
 
谢谢各位大侠帮忙,其实我是只要调用第一个象素点位置就好了的,但是dll里边需要传进去的是
bmp图片的首地址
还有就是我刚好看了Inprise的新闻组里边的一个帖子,要把Stream.position:=0;
才能有效,另外图片我已经在Image1里边预先load了的:)




function DIBWalsh1(lpDIBBits:Pointer;lWidth: Integer;lHeight: Integer): Boolean;stdcall;external 'trans.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
p: Pointer;
t: Boolean;
Stream:TMemoryStream;
begin
t:=false;
Stream:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Stream);
P:=Stream.Memory; //P 为bmp图片首地址
t:=DIBWalsh1(p,Image1.Picture.Bitmap.width,Image1.Picture.Bitmap.Height);
stream.Position:=0; //声明为首位置
Image1.Picture.bitmap.LoadFromStream(Stream);
end;
 
多人接受答案了。
 
后退
顶部