(DirectX) Screenshot vom Front- bzw. Backbuffer erstellen ?!

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

(DirectX) Screenshot vom Front- bzw. Backbuffer erstellen ?!

Beitrag von nco2k »

hi folks,

ich suche einen befehl, mit dem ich ein "screenshot" vom front- bzw. backbuffer erstellen und als datei ausgeben kann. hat zufällig jemand eine idee??

vielen dank im voraus!

c ya,
nco2k
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

Code: Alles auswählen

;Bitmap anlegen 
CreateImage(0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN)) 
;auf angelegtes Bitmap zeichnen 
DC = StartDrawing(ImageOutput()) 
BitBlt_(DC,0,0,ImageWidth(),ImageHeight(),GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY ) 
StopDrawing() 

;Bitmap an Fenstergroesse anpassen 
ResizeImage(0,640,480) 

If OpenWindow(0, 10, 10, 640, 480, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Screenshot") 
StartDrawing(WindowOutput()) 
DrawImage(ImageID(),0,0) 
StopDrawing() 
  Repeat 
    EventID.l = WaitWindowEvent() 
    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 
  Until Quit = 1 
EndIf 
End  

; ExecutableFormat=Windows
; EOF
(Aus dem CodeArchiv)

mfG
Basti

//Edit: Ist dann wohl immer aus dem Front-Buffer, und ob es unter DirectX funzt weiß ich nicht

//Edit: PureArea.net -> CodeArchive -> Windows_System -> Screenshots
Zuletzt geändert von sbehrens am 15.10.2004 14:20, insgesamt 2-mal geändert.
enjoy life... while you can!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

@ptI:
Das ist glaube ich nicht was er wollte. Er will einfach das Back- ODER Front- Buffer kopieren, nicht das, was gerade auf dem Bildschirm ist(gut Frontbuffer ist eigentlich das, was auf dem Bildschirm ist, aber was will man tun, wenn es im Fenstermodus ist?).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

ich kenne das schon aus dem alten forum und genau das ist es, was ich nicht suche. :lol:

der code macht einen direkten schnapschuss "von oben drauf" samt allen was dazwischen steht. wenn ich z.b. das selbe im windowed mode machen würde und ein fenster würde einen teil, meiner anwendung verdecken, würde diese dann auch mit aufs foto gepackt und das will ich nicht. bisher habe ich das immer so gelöst http://robsite.de/php/pureboard-archiv/ ... php?t=4116, aber das ist nur eine notlösung, die ich vermeiden möchte.

c ya,
nco2k
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: (DirectX) Screenshot vom Front- bzw. Backbuffer erstelle

Beitrag von Danilo »

nco2k hat geschrieben:ich suche einen befehl, mit dem ich ein "screenshot" vom front- bzw. backbuffer erstellen und als datei ausgeben kann. hat zufällig jemand eine idee??
Ich mache Screenshots einfach bei einer Taste (z.B. F1):
GrabSprite, SaveSprite, FreeSprite

EDIT:
Falls Du direkt DX meinst, dann kommt es darauf an welche
Version von DX Du programmierst.
Bei DX9 schauste Dir mal IDirect3DDevice9::GetFrontBufferData() an.

IDirect3DDevice9::GetFrontBufferData():
"This method is the only way to capture an antialiased screen shot."
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
MUDHead
Beiträge: 107
Registriert: 08.09.2004 11:00
Wohnort: Berlin

Beitrag von MUDHead »

MUDHead hat geschrieben:Screenshots kann man ganz einfach so machen:

Code: Alles auswählen

Procedure Screenshot(ImageNr,x,y,Width,Height) 
  hImage = CreateImage(ImageNr,Width,Height) 
  hDC    = StartDrawing(ImageOutput()) 
  DeskDC = GetDC_(GetDesktopWindow_()) 
  BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY) 
  StopDrawing() 
  ReleaseDC_(GetDesktopWindow_(),DeskDC) 
 ProcedureReturn hImage 
EndProcedure


Screenshot(0, 0, 0, 1024, 768) 
SaveImage(0, "C:\DesktopScreenshot.gif")
oder gleich im Programm mit :

Code: Alles auswählen

 SaveSprite, FreeSprite,GrabSprite
ah, hat Danilo schon gesagt.


EDIT: Code eingerückt
sry, hab nicht gesehen, dass es schon mal angeboten wurde.



Ja,

Code: Alles auswählen

GrabSprite,SaveSprite, FreeSprite
Zuletzt geändert von MUDHead am 15.10.2004 16:56, insgesamt 1-mal geändert.
Malus, qui potest rerum cognoscere.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@MUDHead
das suche ich nicht, siehe weiter oben! ausserdem meinst du sicherlich "GrabSprite,SaveSprite,FreeSprite" und nicht "SaveSprite,FreeSprite,GrabSprite".

@Danilo
vielen dank für den tip! wusste nicht das es so auch geht. werd mir dennoch mal IDirect3DDevice9::GetFrontBufferData() anschauen, klingt sehr vielversprechend. :allright:

c ya,
nco2k
Antworten