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
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
Antwort Antwort


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 06:13 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