![]() |
AW: Directx bitmap stretchen/Skalieren
Zitat:
Ansonsten wären das 5 Zeilen Code da ich alle Frames zum rendern in meiner DLL direkt abgreifen kann. Aber wie gesagt muss es mit DirectX machen da Win8 kein DWM mehr unterstützt.. was noch dazu kommt. gruss |
AW: Directx bitmap stretchen/Skalieren
Was den Screenshot angeht, ist die GDI Methode, laut eines Artikels, den ich letztens gelesen habe, sogar noch schneller, als es per OffscreenSurface zu machen. Aber du hast natürlich recht, dass du per GDI wohl keine Hardware Accellerated Windows capturen kannst.
Ich schaue, wenn ich daheim bin, nochmal ob ich es über den Umweg über eine Textur hinbekomme. |
AW: Directx bitmap stretchen/Skalieren
Zitat:
Das bremst das ganze natürlich aus. Bei einem ScreenShot spielt das keine rolle in einer Renderscene hingegen schon. ![]() Ich habe mal versucht seine Methode nach zu verfolgen.. aber auch hier keine Chance. Zitat von dort!
Zitat:
gruss |
AW: Directx bitmap stretchen/Skalieren
Interessanterweise ist bei mir der Inhalt des OffscreenPlainSurfaces bereits komplett schwarz :?
|
AW: Directx bitmap stretchen/Skalieren
Zitat:
Den normalen ScreenShot des Clientbereichs kann ich ohne Probleme erstellen. Hast mein letztes Update geladen?
Delphi-Quellcode:
Gruss
procedure TForm1.btnCaptureClick(Sender: TObject);
var Surface: IDirect3DSurface9; ARect: TRect; p: TPoint; begin //Source if (CaptureX.FDevice.CreateOffscreenPlainSurface( Screen.PrimaryMonitor.BoundsRect.Right, Screen.PrimaryMonitor.BoundsRect.Bottom, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, 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; |
AW: Directx bitmap stretchen/Skalieren
Ich hatte ausversehen den GetFrontBufferData Aufruf mit auskommentiert :oops: Habe es jetzt auf diverse Arten probiert, aber leider auch ohne Erfolg. Im Moment fällt mir als Workaround nur noch ein die Daten per LockRect in ein Bitmap (oder eine Textur) rüberzuschieben und dann weiterzuverarbeiten.
|
AW: Directx bitmap stretchen/Skalieren
Zitat:
Denke die StretchRect Function ist nicht das was man in GDI unter StretchBlt versteht. Das teil will irgendwie nicht. Theoretisch müsste es doch reichen wenn man die Daten im source in ein Bitmap kopiert und dieses dann mit StretchBlt verkleinert und dann abspeichert letztendlich muss ich eh den Header und die Pixeldaten an AtmoWin weiter reichen. gruss |
AW: Directx bitmap stretchen/Skalieren
Zitat:
|
AW: Directx bitmap stretchen/Skalieren
Zitat:
Delphi-Quellcode:
natürlich ohne zu speichern das BMP müsste dann noch gestretcht werden.scrSurface.LockRect(LockedRect, @ARect, 0); BitsPerPixel := GetDeviceCaps(GetWindowDC(GetDesktopWindow) , BITSPIXEL); BMP := TBitmap.Create; BMP.Width := Screen.Width; BMP.Height := Screen.Height; case BitsPerPixel of 8 : BMP.PixelFormat := pf8bit; 16: BMP.PixelFormat := pf16bit; 24: BMP.PixelFormat := pf24bit; 32: BMP.PixelFormat := pf32bit; end; p := Cardinal(LockedRect.pBits); for i := 0 to Screen.Height - 1 do begin CopyMemory(BMP.ScanLine[i], Ptr(p), Screen.Width * BitsPerPixel div 8); p := p + LockedRect.Pitch; end; BMP.SaveToFile('D:\Test.bmp'); BMP.Free; scrSurface.UnlockRect; EDIT: Geht auch nicht wirklich. gruss |
AW: Directx bitmap stretchen/Skalieren
Sieht gut aus. Du kannst allerdings davon ausgehen, dass dein Surface immer 32 Bits beinhaltet, da du es im Format ARGB erstellt hast. Das Surface hat sogar dann 32 Bit, wenn das System aus irgendeinem Grund nur auf 16 Bit Farbtiefe eingestellt ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr. |
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