AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Directx bitmap stretchen/Skalieren
Thema durchsuchen
Ansicht
Themen-Optionen

Directx bitmap stretchen/Skalieren

Ein Thema von EWeiss · begonnen am 2. Jan 2014 · letzter Beitrag vom 4. Jan 2014
Antwort Antwort
Seite 1 von 3  1 23      
EWeiss
(Gast)

n/a Beiträge
 
#1

Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 00:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 02:09
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 2. Jan 2014 um 02:12 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 03:52
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

Geändert von EWeiss (11. Jul 2019 um 15:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 09:13
Glaube, du hast beim D3DXSaveSurfaceToFile Aufruf lediglich Surface mit DestSurface vertauscht
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 11:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 14:12
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 2. Jan 2014 um 14:14 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 15:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 15:10
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).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 15:22
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 15:59
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 Uhr.
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