Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Directx bitmap stretchen/Skalieren (https://www.delphipraxis.net/178326-directx-bitmap-stretchen-skalieren.html)

EWeiss 2. Jan 2014 01:55

Directx bitmap stretchen/Skalieren
 
Hab mich im Net fast dumm gesucht..
Wie kann ich ein Surface zur Laufzeit stretchen ohne dieses zwischen zu speichern?

Das Bitmap generiere ich auf dieser weise..

Delphi-Quellcode:
procedure TForm1.btnCaptureClick(Sender: TObject);
var
  Surface: IDirect3DSurface9;
  ARect: TRect;
  Mode: D3DDISPLAYMODE;
  p: TPoint;

begin
  CaptureX.FDevice.GetDisplayMode(0, Mode);

  if (CaptureX.FDevice.CreateOffscreenPlainSurface(
      Mode.Width,
      Mode.Height, D3DFMT_A8R8G8B8,
      D3DPOOL_SCRATCH, Surface, nil) = S_OK) then
  begin
    CaptureX.FDevice.GetFrontBufferData(0, Surface);

    ARect := clientRect;
    P := ClientToScreen(Point(clientrect.Left, clientrect.Top));
    SetRect(ARect, p.x, p.y, p.x + ARect.right, p.y + ARect.bottom);


    D3DXSaveSurfaceToFileW('D:\paper.bmp', D3DXIFF_BMP, Surface, nil, @ARect);
  end;

  Timer1.Enabled := False;

end;
Bevor ich das Teil jetzt abspeichere möchte ich den Surface inklusive Inhalt auf eine Größe von 64x48 skalieren

gruss

Zacherl 2. Jan 2014 03:09

AW: Directx bitmap stretchen/Skalieren
 
Edit: Kommando zurück. Hiermit kannst du das Originalsurface auf ein anderes Surface zeichnen:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Du musst dir also vorher nur ein neues Surface mit einer Größe von 64x48 erstellen.

EWeiss 2. Jan 2014 04:52

AW: Directx bitmap stretchen/Skalieren
 
Zitat:

Zitat von Zacherl (Beitrag 1241700)
Edit: Kommando zurück. Hiermit kannst du das Originalsurface auf ein anderes Surface zeichnen:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Du musst dir also vorher nur ein neues Surface mit einer Größe von 64x48 erstellen.

Ja und das habe ich versucht.

Delphi-Quellcode:
procedure TForm1.btnCaptureClick(Sender: TObject);
var
  Surface: IDirect3DSurface9;
  SurfaceDest: IDirect3DSurface9;
  ARect: TRect;
  DestRect: TRect;
  Mode: D3DDISPLAYMODE;
  p: TPoint;

begin
  CaptureX.FDevice.GetDisplayMode(0, Mode);
  //Source
  if (CaptureX.FDevice.CreateOffscreenPlainSurface(
      Mode.Width,
      Mode.Height, D3DFMT_A8R8G8B8,
      D3DPOOL_SCRATCH, Surface, nil) = S_OK) then
    begin
      CaptureX.FDevice.GetFrontBufferData(0, Surface);

      ARect := clientRect;
      P := ClientToScreen(Point(clientrect.Left, clientrect.Top));
      SetRect(ARect, p.x, p.y, p.x + ARect.right, p.y + ARect.bottom);

      DestRect.Left := 0;
      DestRect.Top := 0;
      DestRect.Right := 64;
      DestRect.Bottom := 48;

      // Dest
      CaptureX.FDevice.CreateOffscreenPlainSurface(
        DestRect.Right,
        DestRect.Bottom, D3DFMT_A8R8G8B8,
        D3DPOOL_SCRATCH, SurfaceDest, nil);

      CaptureX.FDevice.GetFrontBufferData(0, SurfaceDest);

      CaptureX.FDevice.StretchRect(Surface, @ARect, SurfaceDest, @DestRect, D3DTEXF_NONE);

    D3DXSaveSurfaceToFileW('D:\paper.bmp', D3DXIFF_BMP, Surface, nil, @DestRect);
  end;

  Timer1.Enabled := False;

end;
Neues Surface erstellt und dann versucht vom source ins dest zu kopierrn.
Es gab zwar ein Bild aber 64x48 vom Desktop an der 0,0 Position (siehe Anhang)

hab auch UpdateSurface getestet
Zitat:

Copies rectangular subsets of pixels from one surface to another.
Muss weiter probieren ;)
Irgendwas scheint da wieder zu fehlen :)


gruss

Zacherl 2. Jan 2014 10:13

AW: Directx bitmap stretchen/Skalieren
 
Glaube, du hast beim D3DXSaveSurfaceToFile Aufruf lediglich Surface mit DestSurface vertauscht :)

EWeiss 2. Jan 2014 12:57

AW: Directx bitmap stretchen/Skalieren
 
Zitat:

Zitat von Zacherl (Beitrag 1241716)
Glaube, du hast beim D3DXSaveSurfaceToFile Aufruf lediglich Surface mit DestSurface vertauscht :)

JO wenn ich schon den Source in Destination kopiere dann sollte ich auch das neue abspeichern.

War mit Sicherheit einer der Fehler ;) Den anderen muss ich noch suchen.
Denn das Bitmap ist nun schwarz was abgespeichert wurde.
Etwas undurchsichtig DX :)

gruss

Zacherl 2. Jan 2014 15:12

AW: Directx bitmap stretchen/Skalieren
 
Zitat:

Zitat von EWeiss (Beitrag 1241766)
Etwas undurchsichtig DX :)

Definitiv. Ich bin mich grade auch im Rahmen eines kleinen Projekts etwas mit DX9 am beschäftigen und bin noch weit entfernt davon, alle Eigenarten zu kennen.

Grade noch gelesen:
Zitat:

The source and destination surfaces must be created in the default memory pool.
Also hier mal bei beiden Surfaces D3DPOOL_DEFAULT statt D3DPOOL_SCRATCH probieren.

EWeiss 2. Jan 2014 16:03

AW: Directx bitmap stretchen/Skalieren
 
Zitat:

Zitat von Zacherl (Beitrag 1241786)
Zitat:

Zitat von EWeiss (Beitrag 1241766)
Etwas undurchsichtig DX :)

Definitiv. Ich bin mich grade auch im Rahmen eines kleinen Projekts etwas mit DX9 am beschäftigen und bin noch weit entfernt davon, alle Eigenarten zu kennen.

Grade noch gelesen:
Zitat:

The source and destination surfaces must be created in the default memory pool.
Also hier mal bei beiden Surfaces D3DPOOL_DEFAULT statt D3DPOOL_SCRATCH probieren.

Hatte ich schon probiert trotzdem Danke.. (beide Bilder sind dann Schwarz)
Kann nicht sein das dass Projekt jetzt scheitert wegen dem resize eines Bildes..

Da bekommt man echt die Krise ;)

Hab glaube ich gelesen das StretchRect in Verbindung mit Offscreen nicht funktionieren soll.
Boahh jeder schreibt was anderes wenn man im Net so die Seiten durchblättert.

gruss

Zacherl 2. Jan 2014 16:10

AW: Directx bitmap stretchen/Skalieren
 
Ich würde dir weiterhin dazu raten das ganze per GDI zu machen. Hatte dir ja mal per PN eine Funktion geschickt, die per GDI einen Screenshot anfertigt und diesen danach mit dem HALFTONE Verfahren auf die gewünschte Größe verkleinert.

Dann sparst du dir sogar die manuelle Berechnung der AmbiLight Farben, da du die Randpixel des verkleinerten Screenshots direkt als AmbiLight Color für den entsprechenden Punkt verwenden kannst. (Die AmbiLight Berechnung ist ja im Prinzip nicht anderes als ein Rastern des Bildes in gleichgroße Teile und darauf folgend die Berechnung der Durchschnittsfarbe. Also genau das, was das HALFTONE Verfahren beim Verkleinern auch macht).

EWeiss 2. Jan 2014 16:22

AW: Directx bitmap stretchen/Skalieren
 
Zitat:

Zitat von Zacherl (Beitrag 1241797)
Ich würde dir weiterhin dazu raten das ganze per GDI zu machen. Hatte dir ja mal per PN eine Funktion geschickt, die per GDI einen Screenshot anfertigt und diesen danach mit dem HALFTONE Verfahren auf die gewünschte Größe verkleinert.

Dann sparst du dir sogar die manuelle Berechnung der AmbiLight Farben, da du die Randpixel des verkleinerten Screenshots direkt als AmbiLight Color für den entsprechenden Punkt verwenden kannst. (Die AmbiLight Berechnung ist ja im Prinzip nicht anderes als ein Rastern des Bildes in gleichgroße Teile und darauf folgend die Berechnung der Durchschnittsfarbe. Also genau das, was das HALFTONE Verfahren beim Verkleinern auch macht).

Ja wenn es so einfach wäre..
Das Problem ist ich muss OpenGL und auch DirectX Fenster erfassen können.
Das geht ohne DirectX und in Verbindung mit einer DirectX Anwendung (MediaPortal) so nicht.
Wäre ansonsten direkt auf GDI+ umgestiegen da hätte ich diese Probleme alle nicht.
Aber wie gesagt man kann letztendlich nur lernen.

gruss

Namenloser 2. Jan 2014 16:59

AW: Directx bitmap stretchen/Skalieren
 
Also ab Vista kann man auch mit GDI Screenshots von DirectX- und OpenGL-Fenstern machen. Wichtig ist glaube ich nur, dass man beim BitBlt vom Desktop auf das Bitmap CAPTUREBLT beim mit angibt. Zumindest wenn man transparente (layered) Fenster mit drauf haben will, braucht man das. Daher nehme ich an, dass man es für DirectX- und OpenGL-Fenster auch braucht.

Allerdings klappt das nur, wenn der DWM läuft. Das heißt, Aero muss aktiviert sein.

Falls du es aber hinkriegst, mit DirectX einen Screenshot zu erzeugen, würde mich das auch interessieren. Das hatte ich vor Jahren mal probiert, aber hatte das gleiche Problem wie du: Überall stand was anderes und nichts davon funktionierte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.
Seite 1 von 3  1 23      

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