Hardcopy Bildschirm

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Hardcopy Bildschirm

Beitrag von Martin66119 »

Einen guten Morgen!

Hier im Forum habe ich folgenden Code gefunden, mit dem man eine Hardcopy vom Bildschirm machen kann. Nun bekomme ich es aber nicht hin, das Ergebnis z.B. in einem Laufwerk z.B. unter H:\Hardcopy\Bild1.jpg zu speichern.

Kann mir jemand sagen wie das geht?

Hier der Code:
;nicolaus - http://www.purebasic.fr/german/viewtopic.php?t=10790

Procedure.l CaptureScreen()
ExamineDesktops()
width = DesktopWidth(0)
height = DesktopHeight(0)
srcDC = CreateDC_("DISPLAY", "", "", dm.DEVMODE)
trgDC = CreateCompatibleDC_(srcDC)
BMPHandle = CreateCompatibleBitmap_(srcDC, width, height)
SelectObject_( trgDC, BMPHandle)
BitBlt_( trgDC, 0, 0, width, height, srcDC, 0, 0, #SRCCOPY)
DeleteDC_( trgDC)
ReleaseDC_(BMPHandle, srcDC)
CreateImage(0, width, height, 32)
StartDrawing(ImageOutput(0))
DrawImage(BMPHandle, 0, 0)
StopDrawing()

DeleteObject_(BMPHandle)
EndProcedure

OpenWindow(0,0,0,320,240,"",$CF0001)
SetWindowLong_(WindowID(0),#GWL_EXSTYLE,GetWindowLong_(WindowID(0),#GWL_EXSTYLE)|#WS_EX_LAYERED)

Delay(100)
CaptureScreen()
ResizeImage(0,640,480)
OpenWindow(1,0,0,640,480,"",$CF0001)
CreateGadgetList(WindowID(1))
ImageGadget(0,0,0,0,0,ImageID(0))
Repeat:Until WaitWindowEvent()=#WM_CLOSE


Grüße und schonmal Danke
Martin
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Hardcopy Bildschirm

Beitrag von STARGÅTE »

Bitte Code-Tags verwenden.

Zum Speichern von Images gibt es: SaveImage()

Dort dann einfach die Image-Nummer angeben die du in deinem Code auch nutzt (in dem Fall 0)
und den Speicher-Pfad

Für *.jpg benötigst du dann noch den UseJPEGImageEncoder() wie es auch in der Hilfe steht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Hardcopy Bildschirm

Beitrag von Martin66119 »

Vielen Dank für die Antwort!

Hat geklappt!!!!!

Ich habe

SaveImage(0, "H:\Copy.bmp")

hinter die Zeile

ResizeImage(0,640,480)

eingefügt.


Sorry, habe noch eine Frage hinterher!

Die abgespeicherte Datei ist ja 1,2MB groß. Kann man die nicht kleiner machen?

Grüße
Martin
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Hardcopy Bildschirm

Beitrag von Kiffi »

Martin66119 hat geschrieben:Die abgespeicherte Datei ist ja 1,2MB groß. Kann man die nicht kleiner machen?
speicher das Bild als JP(E)G oder PNG.

Grüße ... Kiffi
a²+b²=mc²
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Hardcopy Bildschirm

Beitrag von Martin66119 »

Vielen Dank!

Hat alles funktioniert.

Nun sind es nur noch 104k (habe png genommen).

Grüße
Martin
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Hardcopy Bildschirm

Beitrag von Martin66119 »

Hallo mal wieder,

das mit der screenshot funktioniert bestens! Vielen Dank noch mal!

Nun frage ich mich aber, wie man 2 oder drei "Bilder" in eine Datei packen kann, damit man einen Ablauf aufzeichenn kann um diesen z.B. bei Schulungszwecken zeigen zu können.

Grüße
Martin
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Hardcopy Bildschirm

Beitrag von TomS »

Wie meinst du "in eine Datei"?
Filmstreifenmäßig?

Dazu musst du mit CreateImage() ein Image erstellen, dass so groß ist, dass alle Bilder reinpassen. Dann die einzelnen Bilder mit DrawImage() "draufkleben" und dann das große Bild abspeichern.

Code: Alles auswählen

UseJPEGImageDecoder()
UseJPEGImageEncoder()

#Anzahl = 2

For a = 1 To #Anzahl
	image$ = OpenFileRequester("","","*.jpg",0)
	If image$
		LoadImage(a, image$)		
		width + ImageWidth(a)
		If ImageHeight(a) > height
			height = ImageHeight(a)
		EndIf 
	EndIf
Next 

image = CreateImage(#PB_Any, width, height)

StartDrawing(ImageOutput(image))
	For a = 1 To #Anzahl
		If IsImage(a-1)
			DrawImage(ImageID(a), ImageWidth(a-1), 0)
		Else 
			DrawImage(ImageID(a), 0, 0)
		EndIf
		
	Next 
StopDrawing()

save$ = SaveFileRequester("","","*.jpg",0)

If save$
	SaveImage(image, save$, #PB_ImagePlugin_JPEG)
EndIf 

End 
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Hardcopy Bildschirm

Beitrag von Martin66119 »

Hallo!

Ja, ich meine sowas wie "Filmstreifenmäßig" bzw. dass man mit einem Bildbetrachtungsprogramm von einem zum anderen Bild durchklicken kann.

Was ich im Moment verwende, ist das was ich hier im Forum bekommen habe. Damit kann speichere ich jedes einzelne Bild in einen getrennten Datei. Nun möchte ich aber, dass die Bilder in einer Datei "Filmstreifenmäßig" drin sind oder aber mit einem Bildbetrachtungsprogramm durchgeklickt werden können.
;------------------------------------------------------------
UseJPEGImageDecoder()
UseJPEGImageEncoder()

Procedure.l CaptureScreen()
ExamineDesktops()
width = DesktopWidth(0)
height = DesktopHeight(0)
srcDC = CreateDC_("DISPLAY", "", "", dm.DEVMODE)
trgDC = CreateCompatibleDC_(srcDC)
BMPHandle = CreateCompatibleBitmap_(srcDC, width, height)
SelectObject_( trgDC, BMPHandle)
BitBlt_( trgDC, 0, 0, width, height, srcDC, 0, 0, #SRCCOPY)
DeleteDC_( trgDC)
ReleaseDC_(BMPHandle, srcDC)
CreateImage(0, width, height, 32)
StartDrawing(ImageOutput(0))
DrawImage(BMPHandle, 0, 0, 640,480)
StopDrawing()
DeleteObject_(BMPHandle)
EndProcedure


If OpenWindow(0, 0, 0, 400, 100, "Timer Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
DisableWindow(0, 1)

AddWindowTimer(0, 123, 2000)

Value = 0
Repeat
Event = WaitWindowEvent()

If Event = #PB_Event_Timer And EventTimer() = 123
CaptureScreen()
i = i+1
name$ = "h:\Datei" + Str(i)
SaveImage(0,name$,#PB_ImagePlugin_JPEG)
EndIf

Until Event = #PB_Event_CloseWindow
EndIf
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Hardcopy Bildschirm

Beitrag von TomS »

Na, meinen Code wirst du doch wohl an deinen Code anpassen können, oder nicht?
Bildbetrachter klicken in der Regel einzelne Bilder durch.
Ich verstehe jetzt nicht, warum du das ein einer Datei haben willst, wenn du eien Bildbetrachter verwendest mit dem du dann doch wieder die einzelnen Bilder ansehen willst.

Und vielleicht benutzt du mal Code-Tags?

Code: Alles auswählen

[code]
;Dein PB Code
[/code]
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Hardcopy Bildschirm

Beitrag von Martin66119 »

Hallo TomS,

ja das bekomme ich hin, denke ich! Wollte nur kurz wiedergeben was ich im Moment verwende! Den Code-Tags werde ich künftig verwenden!

Gruß
Martin
Antworten