图片贴在D3D 表面上成功 把代码分享出来
delphi吧
全部回复
仅看楼主
level 10
5xHs 楼主
自己读取BMP 数据 不介入 TBMPMAP BIT类
type
stRGB = packed record //定义 24位图格式
R: Byte;
G: Byte;
B: Byte;
end;
stXRGB = packed record //定义 d3d 表面可以用的格式
X: Byte;
R: Byte;
G: Byte;
B: Byte;
end;
ArrRGB = array of stXRGB; // d3d 表面可以用的格式 的数组 类型
var
SurDesc: D3DSURFACE_DESC; //表面的信息结构
bmpSurface, backSurface: IDirect3DSurface9; //表面指针 1.图像表面 2.后备缓存表面
bmprect: D3DLOCKED_RECT;
bitStream: TFileStream;
stBITHeader: BITMAPFILEHEADER; // BMP 信息头
stBitInfoHeader: BITMAPINFOHEADER;
I: Integer;
rcRGB: stRGB;
pSurfaceData: Pointer;
begin
if not FileExists (FilePath) then
begin
ShowMessage('加载的图片不存在!!!');
Exit;
end;
bitStream:= TFileStream.Create(FilePath, fmOpenRead or fmShareDenyNone);
bitStream.Read(stBITHeader, SizeOf(BITMAPFILEHEADER));
bitStream.Read(stBitInfoHeader, SizeOf(BITMAPINFOHEADER));
m_d3ddev.GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, backSurface);
backSurface.GetDesc(SurDesc);
m_d3ddev.CreateOffscreenPlainSurface(stBitInfoHeader.biWidth, stBitInfoHeader.biHeight, SurDesc.Format, D3DPOOL_SYSTEMMEM, bmpSurface, 0);
m_d3ddev.BeginScene();
bmpSurface.LockRect(bmprect, nil, 0);
pSurfaceData:= bmprect.pBits;
for I := stBitInfoHeader.biWidth * stBitInfoHeader.biHeight - 1 downto 0 do
begin
bitStream.Read(rcRGB, SizeOf(strgb));
ArrRGB(pSurfaceData)[I].R:= rcRGB.R;
ArrRGB(pSurfaceData)[I].G:= rcRGB.G;
ArrRGB(pSurfaceData)[I].B:= rcRGB.B;
end;
bitStream.Free;
bmpSurface.UnlockRect;
m_d3ddev.UpdateSurface(bmpSurface, nil, backSurface, nil);
m_d3ddev.EndScene;
backSurface:= nil;
m_d3ddev.Present(nil, nil, 0, nil);
bmpSurface:= nil;
2017年03月15日 07点03分 1
level 10
5xHs 楼主
2017年03月15日 07点03分 2
吧务
level 14
支持分享
2017年03月15日 07点03分 3
level 10
5xHs 楼主
第一版 代码 加载速度慢 所以改成 汇编 移动数据
var
SurDesc: D3DSURFACE_DESC; //表面的信息结构
bmpSurface, backSurface: IDirect3DSurface9; //表面指针 1.图像表面 2.后备缓存表面
bmprect: D3DLOCKED_RECT;
stBITHeader: BITMAPFILEHEADER; // BMP 信息头
stBitInfoHeader: BITMAPINFOHEADER;
I, J: Integer;
SurfaceOffset, BmpOffset: Integer;
pSurfaceData, pBmpData: PByte;
FileHandle: Integer;
begin
if not FileExists (FilePath) then
begin
ShowMessage('加载的图片不存在!!!');
Exit;
end;
FileHandle:= FileOpen(FilePath, fmOpenRead);
FileRead(FileHandle, stBITHeader, SizeOf(BITMAPFILEHEADER));
FileSeek(FileHandle, SizeOf(BITMAPFILEHEADER), 0);
FileRead(FileHandle, stBitInfoHeader, SizeOf(BITMAPINFOHEADER));
FileSeek(FileHandle, SizeOf(BITMAPINFOHEADER), SizeOf(BITMAPFILEHEADER));
pBmpData:= pByte(AllocMem(3*(stBitInfoHeader.biWidth * stBitInfoHeader.biHeight)));
FileRead(FileHandle, pBmpData^, 3*(stBitInfoHeader.biWidth * stBitInfoHeader.biHeight));
FileClose(FileHandle);
m_d3ddev.GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, backSurface);
backSurface.GetDesc(SurDesc);
m_d3ddev.CreateOffscreenPlainSurface(stBitInfoHeader.biWidth, stBitInfoHeader.biHeight, SurDesc.Format, D3DPOOL_SYSTEMMEM, bmpSurface, 0);
m_d3ddev.BeginScene();
bmpSurface.LockRect(bmprect, nil, 0);
pSurfaceData:= bmprect.pBits;
for I := 0 to stBitInfoHeader.biHeight - 1 do
begin
for J := 0 to stBitInfoHeader.biWidth - 1 do
begin
SurfaceOffset:= (J * 4)+(I * (stBitInfoHeader.biWidth * 4));
BmpOffset:=(J * 3)+((stBitInfoHeader.biHeight - I) * (stBitInfoHeader.biWidth * 3));
asm
pushad
mov edi, pSurfaceData
mov esi, pBmpData
mov eax, BmpOffset
add esi, eax
mov ebx, [esi]
and ebx, $00FFFFFF
mov eax, SurfaceOffset
add edi, eax
mov [edi], ebx
popad
end;
end;
end;
FreeMem(pBmpData);
bmpSurface.UnlockRect;
m_d3ddev.UpdateSurface(bmpSurface, nil, backSurface, nil);
m_d3ddev.EndScene;
backSurface:= nil;
m_d3ddev.Present(nil, nil, 0, nil);
bmpSurface:= nil;
2017年03月15日 12点03分 4
level 10
5xHs 楼主
2017年03月15日 12点03分 5
level 12
既然都用了D3D了,2个接口就解决了的事情没必要搞成那样,而且那样也没用接口方便
2017年03月16日 02点03分 6
借助 D3DX 是可以加载图片 但是 如果不是BMp文件呢 D3DX就不行了
2017年03月16日 07点03分
@5xHs 谁跟你说的只能是BMP?!包括例子里文件名虽然涂了,但后缀那个JPG也很明显呀
2017年03月17日 08点03分
level 10
5xHs 楼主
回复 A1Duke :大神 我指的不是图片格式
2017年03月18日 00点03分 7
1