Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Desktop-Overlay mit DirectX (https://www.delphipraxis.net/83125-desktop-overlay-mit-directx.html)

hugo1990 29. Dez 2006 10:47

Re: Desktop-Overlay mit DirectX
 
Habe gerade festgestellt, das wenn ich für die YUV berechnung nur einen Farbton (z.B. r) nehmen, dann ist es immer noch ein buntes gekrissele, obwohl es dann Schwarz/Weiß sein müsste. Also hab ich ein bisschen rumgebasstelt und rausgefunden, das er statt Weiß immer einen Grünton anzeigt. Wo könnte der Fehler liegen. Ich hab jetzt für die Berechnung auch mal das genommen, wie es in der c++ Datei steht, also folgender Maßen:
Delphi-Quellcode:
y:=Trunc(0.29*r+0.59*r+0.14*r);
u:=Trunc(128-0.14*r-0.29*r+0.43*r);
v:=Trunc(128+0.36*r-0.29*r-0.07*r);

JamesTKirk 29. Dez 2006 12:44

Re: Desktop-Overlay mit DirectX
 
Jetzt wo ich bei mir zu Hause ebenfalls einen Rechner gefunden habe, der nur YUV unterstützt (meinen Win2000/98 Testrechner), werde ich mich mal daran machen das auszutesten. Melde mich dann wieder :zwinker: (Deinen Code teste ich auch mal aus...)

Edit: 0 bei Win2000 vergessen -.-

Phantom1 29. Dez 2006 16:10

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;

hugo1990 29. Dez 2006 19:29

Re: Desktop-Overlay mit DirectX
 
Cool vielen vielen Dank an Phantom1, jetzt geht es, nur irgendwie ist das weiß ein grau. Muss das so sein.
Edit: Das weiß ist doch nicht grau es ist nur dreckig. :lol:

Phantom1 29. Dez 2006 21:03

Re: Desktop-Overlay mit DirectX
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich seh grad, ich hab eine alte version hochgeladen, da waren noch 2 oder 3 fehler drinnen. Im Anhang findet ihr die neuere Version.

Delphi-Quellcode:
function TForm1.CopyImageToSurface(Bmp32: TBitmap32; surface: IDirectDrawSurface7): Boolean;
var ddsd: TDDSURFACEDESC2;
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;

  with ddsd do
    ARGBToCodec(Bmp32.PixelPtr[0, 0], lpSurface, dwWidth, dwHeight, ddpfPixelFormat.dwRGBBitCount, ddpfPixelFormat.dwFourCC);

  surface.Unlock(nil);
  Result:=True;
end;

Leifcp 13. Feb 2007 15:21

Re: Desktop-Overlay mit DirectX
 
Hey,
ich kriege den Fehler "Undefinierter Bezechner 'DDCAPS_DX7'"...
Dabei habe ich alle schon gelinkten DirectX-Header drin -
kann mir jemand sagen, wie ich den Fehler beseitige?!


Vielen Dank,
Leif ;O)

Leifcp 14. Feb 2007 12:18

Re: Desktop-Overlay mit DirectX
 
Keine Antwort?
kann doch nicht so schwer sein, oder?

JamesTKirk 15. Feb 2007 19:36

Re: Desktop-Overlay mit DirectX
 
Sorry... ich hatte erst gestern Delphi wieder installiert, da ich meinen PC formatiert hatte :roll:

@Topic:

Welche Headers verwendest du denn?
Ich hab mir heut die neuesten Clooties runtergladen, den Ordner dem "jungfräulichem" Delphi bekannt gegeben und kompiliert... funzt wie beim letzten Mal als ich's verwendet hab :mrgreen:

JamesTKirk 17. Feb 2007 19:44

Re: Desktop-Overlay mit DirectX
 
Für die Leute die Vista benutzen eine kleine Anmerkung (hab ich gerade herausgefunden :mrgreen: ):

Beim verwenden von DirectDraw zum Zeichnen auf den Desktop wird von Aero auf Vista Basic umgeschalten! Liegt wohl daran, dass Aero DirectX verwendet und man mit DirectDraw auf eine etwas andere Art auf die Grafikkarte zugreift... Irgendwie so ^^

Btw:
Mal schauen, ob es durch die Verwendung von DirectX durch Aero nicht leichter für mich wird nen animierten Desktop unterzubringen (die Ultimate Extras könnens ja auch ;) ). Dann müsste ich nur noch eine Abfrage einbauen, ob Vista oder nicht :mrgreen:

JasonDX 17. Feb 2007 22:49

Re: Desktop-Overlay mit DirectX
 
Zitat:

Zitat von JamesTKirk
Beim verwenden von DirectDraw zum Zeichnen auf den Desktop wird von Aero auf Vista Basic umgeschalten! Liegt wohl daran, dass Aero DirectX verwendet und man mit DirectDraw auf eine etwas andere Art auf die Grafikkarte zugreift... Irgendwie so ^^

Verwendest du irgendwo GetSurfaceDesc()? Das vertraegt sich nicht mit dem DWM von Vista und schaltet den aus -> Aero is weg. Anscheinend soll GetDisplayMode das Problem beheben.

greetz
Mike

PS: Nur so nebenbei, DirectDraw ist depricated. Seit ca. 2003 :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz