求TMemoryStream的用法(50分)

  • 主题发起人 主题发起人 kjzx
  • 开始时间 开始时间
K

kjzx

Unregistered / Unconfirmed
GUEST, unregistred user!
请教VB和DELPHI的DX们,如何将下面VB的语句改成DELPHI 。
某一图像BMP的数据在内存里(指针m_VFDataPtr),最终将它放入Picture1中。
我认为在DELPHI里用一个TMemoryStream,写入BMP文件的文件头和调色板等信息,
再把位图数据写进去,然后用TBitmap.LoadFromStream(MemoryStream)。可具体
的写法是......


Command1_Click()
Dim hdcDest As Long
Dim hdcSrc As Long
Dim BmpFileheader As BITMAPFILEHEADER
Dim BmpInfoheader As BITMAPINFOHEADER
m_VFDataPtr As Long

Call RtlMoveMemory(BmpFileheader, ByVal m_VFDataPtr, Len(BmpFileheader))
Call RtlMoveMemory(BmpInfoheader, ByVal (m_VFDataPtr _
+ Len(BmpFileheader)), Len(BmpInfoheader))
BmpFileheader.bfOffBits = Len(BmpFileheader) + Len(BmpInfoheader)
RtlMoveMemory ByVal m_BackSurface.vpBits, ByVal (m_VFDataPtr _
+ BmpFileheader.bfOffBits), BmpInfoheader.biSizeImage
hdcDest = Picture1.hdc
hdcSrc = CreateCompatibleDC(hdcDest)
Call SelectObject(hdcSrc, m_BackSurface.hBmp)
Call BitBlt(hdcDest, 0, 0, 300, 200, hdcSrc, 0, 0, SRCCOPY)
Call DeleteDC(hdcSrc)
Picture1.Refresh
end

Form_Load():
Dim m_BackSurface As DIBData
Dim BmpInfo As BITMAPINFO
BmpInfo.bmiHeader.biSize = Len(BmpInfo.bmiHeader)
BmpInfo.bmiHeader.biWidth = 300
BmpInfo.bmiHeader.biHeight = 200
BmpInfo.bmiHeader.biPlanes = 1
BmpInfo.bmiHeader.biBitCount = 24
BmpInfo.bmiHeader.biCompression = BI_RGB
m_BackSurface.hBmp = CreateDIBSection(ByVal 0, BmpInfo,_
DIB_RGB_COLORS, VarPtr(m_BackSurface.vpBits), ByVal 0, 0)
end
 
为什么用TMemoryStream?用TfileStream不是更好,对资源的要求低一些!可以看一下论坛以前的帖子
 
直接按大意翻譯過來,不知是不是你想要的.
var
BmpFileheader:BITMAPFILEHEADER;
BmpInfoheader:BITMAPINFOHEADER;
Stream:TMemoryStream;
begin
Stream:=TMemoryStream.Create;
try
BmpFileheader.bfOffBits := SizeOf(BmpFileheader) + SizeOf(BmpInfoheader);
Stream.WriteBuffer(BmpFileHeader,SizeOf(BITMAPFILEHEADER));
Stream.WriteBuffer(BmpInfoheader,SizeOf(BmpInfoheader));
Image1.Picture.Bitmap.LoadFromStream(Stream);
Image1.Refresh;
finally
Stream.Free;
end;
end;
 
后退
顶部