Registriert seit: 20. Jun 2003
282 Beiträge
Delphi 10.4 Sydney
|
Re: Desktop-Overlay mit DirectX
29. Dez 2006, 17:10
Für die Umwandlungen in YUY2, UYVY und I420 hab ich vor einiger Zeit eine Unit geschrieben (siehe Anhang). Man braucht jedoch die GR32 Komponenten, da ich das TBitmap32 benutze. Mit ein paar änderungen an meinem Code würde auch ein normales TBitmap funktionieren.
Delphi-Quellcode:
function TForm1.CopyImageToSurface(Bmp32: TBitmap32; surface: IDirectDrawSurface7): Boolean;
var ddsd: TDDSURFACEDESC2; src, dest: Pointer;
begin
Result:=False;
FillChar(ddsd, SizeOf(ddsd), 0);
ddsd.dwSize:=SizeOf(ddsd);
if FAILED(surface.Lock(nil, ddsd, DDLOCK_SURFACEMEMORYPTR or DDLOCK_WAIT, 0)) then
Exit;
src:=Bmp32.PixelPtr[0, 0];
dest:=ddsd.lpSurface;
case ddsd.ddpfPixelFormat.dwFlags of
DDPF_RGB:
case ddsd.ddpfPixelFormat.dwRGBBitCount of
32: Move(src^, dest^, ddsd.dwHeight*ddsd.dwWidth*4);
24: Conv32to24(src, dest, ddsd.dwWidth, ddsd.dwHeight);
16: if ddsd.ddpfPixelFormat.dwGBitMask=$03E0 then
Conv32to15(src, dest, ddsd.dwWidth, ddsd.dwHeight)
else
Conv32to16(src, dest, ddsd.dwWidth, ddsd.dwHeight);
end;
DDPF_FOURCC:
case ddsd.ddpfPixelFormat.dwFourCC of
YUY2: ARGBtoYUY2(src, dest, ddsd.dwWidth, ddsd.dwHeight);
UYVY: ARGBtoUYVY(src, dest, ddsd.dwWidth, ddsd.dwHeight);
I420: ARGBtoI420(src, dest, ddsd.dwWidth, ddsd.dwHeight);
end;
end;
surface.Unlock(nil);
Result:=True;
end;
|
|
Zitat
|