Einzelnen Beitrag anzeigen

Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#23

Re: Desktop-Overlay mit DirectX

  Alt 29. Dez 2006, 16: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;
Angehängte Dateien
Dateityp: pas uconvert_769.pas (8,3 KB, 49x aufgerufen)
  Mit Zitat antworten Zitat