Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Directx bitmap stretchen/Skalieren

  Alt 2. Jan 2014, 04: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 16:42 Uhr)
  Mit Zitat antworten Zitat