![]() |
Screenshot vom Clientbereich der Mainform machen
Hallo,
ich nutze folgenden Code um von meiner MainForm einen ScreenShot zu erstellen:
Delphi-Quellcode:
Nur würde ich gerne nur einen ScreenShot vom Client-Bereich zu machen. Also alles innerhalb der Ränder/Taskleiste.
procedure ScreenShot_erstellen(Pfad: String);
var Bitmap : TBitmap; Canvas : TCanvas; WindowRect: TRect; BitmapRect: TRect; begin //Bitmap erzeugen Bitmap := TBitmap.Create; //Canvas erzeugen Canvas := TCanvas.Create; //Handle für Canvas angeben Canvas.Handle := GetWindowDC(GetDesktopWindow); //Rect von MainForm holen GetWindowRect(Application.MainForm.Handle, WindowRect); try BitmapRect := Rect(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top); //Bitmap-Größe angeben Bitmap.Width := WindowRect.Right - WindowRect.Left; Bitmap.Height := WindowRect.Bottom - WindowRect.Top; Bitmap.Canvas.CopyRect(BitmapRect, Canvas, WindowRect); //nur für den Thread - eigentlich steht zum Speichern noch etwas mehr Code dahinter Bitmap.SaveToFile(Pfad + 'Bild.jpg'); finally //Bitmap löschen und freigeben FreeAndNil(Bitmap); //Canvas löschen und freigeben ReleaseDC(0, Canvas.Handle); FreeAndNil(Canvas); end; end; Ich vermute ich muss die Nullen bei:
Delphi-Quellcode:
durch Startwerte ersetzen, die innerhalb des Fensters sind.
BitmapRect := Rect(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top);
Nur weiss ich nicht wie ich an "ClientLeft" und "ClientTop" komme. (Es gibt ja nur ClientWidth und ClientHeight) Oder gibt es den Clientbereich als Rect? |
AW: Screenshot vom Clientbereich der Mainform machen
Wieso fallen mir nur immer die Lösungen ein, nachdem ich gepostet hab ... :gruebel:
Delphi-Quellcode:
procedure ScreenShot_erstellen(Pfad: String);
var Bitmap : TBitmap; Jpg : TJpegImage; BitmapRect: TRect; i_Width : Integer; i_Height : Integer; begin //Bitmap erzeugen Bitmap := TBitmap.Create; i_Width := Application.MainForm.ClientWidth; i_Height := Application.MainForm.ClientHeight; try //Rect des Clientbereiches definieren BitmapRect := Rect(0, 0, i_Width, i_Height); //Bitmap-Größe angeben Bitmap.Width := i_Width; Bitmap.Height := i_Height; Bitmap.Canvas.CopyRect(BitmapRect, Application.MainForm.Canvas, BitmapRect); //nur für den Thread - eigentlich steht zum Speichern noch etwas mehr Code dahinter Bitmap.SaveToFile(Pfad + 'Bild.jpg'); finally //Bitmap löschen und freigeben FreeAndNil(Bitmap); end; end; |
AW: Screenshot vom Clientbereich der Mainform machen
Wenn du das Formular der Funktion übergeben würdest wär's gleich doppelt so nützlich:
Delphi-Quellcode:
procedure ScreenShot_erstellen(form:TCustomForm; const bitmapfilename: String);
|
AW: Screenshot vom Clientbereich der Mainform machen
TForm hat übrigens bereits eine Methode um den Client-Bereich als Bitmap zurückzuliefern:
![]() |
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
nach so was hab ich gesucht :-) Nur dummerweise scheint das was nicht richtig freigegeben zu werden. Ich erhalte von FastMM folgende Fehlermeldung am Ende vom Programm: Zitat:
Delphi-Quellcode:
(ja ich weiss, da fehlt ein try/finally-Block! - ist nur Test)
procedure TForm1.Button1Click(Sender: TObject);
var Jpg: TJPEGImage; begin Jpg := TJPEGImage.Create; Jpg.Assign(Form1.GetFormImage); Jpg.CompressionQuality := 100; Jpg.ProgressiveEncoding := false; Jpg.SaveToFile('D:\test.jpg'); FreeAndNil(Jpg); end; |
AW: Screenshot vom Clientbereich der Mainform machen
In GetFormImage wird ein Bitmap erzeugt (der Rückgabewert)
Delphi-Quellcode:
var
Jpg: TJPEGImage; BMP:TBitmap; begin Jpg := TJPEGImage.Create; BMP:=Form1.GetFormImage; Jpg.Assign(BMP); BMP.Free; ...... ...... |
AW: Screenshot vom Clientbereich der Mainform machen
Mann häts sich halt mal den Quellcode anschauen sollen :wall: - Danke, Bummi!
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Jpg: TJPEGImage; BMP:TBitmap; begin Jpg := TJPEGImage.Create; try BMP:=Form1.GetFormImage; Jpg.Assign(BMP); Jpg.SaveToFile('D:\test.jpg'); finally BMP.Free; Jpg.Free; end; end; |
AW: Screenshot vom Clientbereich der Mainform machen
Und so etwas ist genau der Grund, weshalb man in Funktionen keine Objekte zurückgeben sollte, die man innerhalb der Funktion erstellt.
|
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
Ich nutz für so was die out Variablen |
AW: Screenshot vom Clientbereich der Mainform machen
Es ist aber egal ob Rückgabewert oder Out-Parameter
|
AW: Screenshot vom Clientbereich der Mainform machen
Out ist für Objektinstanzen aber auch nicht die erste Wahl. Einfach By Value oder als Konstante entgegennehmen, geht beides.
|
AW: Screenshot vom Clientbereich der Mainform machen
Bitte nicht das JPeg Format für Screenshots verwenden!
Durch die verlustbehaftete Komprimierung werden Schriften und Kanten verwaschen. Siehe: ![]() Gif und PNG sind für Screenshots besser geeignet. |
AW: Screenshot vom Clientbereich der Mainform machen
GIF ist für die Anzahl der Farbwerte (kunterbunte GUIs, Farbverläufe, Schriftglättung und Co.) auch nicht unbedingt gut geeignet.
Man kann beim JPEG aber auch die Komprimierungsqualität entsprechend einstellen, dann wird die Datei zwar größer, aber diese Verfälschungen minimieren sich. |
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
Sollte ein Farbverlauf in der Titelleiste als Gif-Bild etwas stufig aussehen ist das weit weniger tragisch als der Verlust an Schärfe bei einem JPEG-Bild. Und wenn man aus dem JPEG Screenshot mit einer Bildverarbeitung einen Ausschnitt wieder im JPEG Format speichert wird das Problem noch schlimmer. Aber im oben angegebenen Link wird eigentlich alles erklärt (inklusive Beispiel wie schlecht so ein JPEG Screnshot aussehen kann). |
AW: Screenshot vom Clientbereich der Mainform machen
Ich bin sowieso eher für PNGs und andere komprimierte Bitmaps.
GIF ist zwar auch nur Bitmap und neuerdings auch komprimiert, aber eben nur mit 256 Farben und wenn man ene blöde Implementierung verwendet, dann auch noch mit einer Standardfarbtabelle, welche recht unpassende Farben bereitstellt. |
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
|
AW: Screenshot vom Clientbereich der Mainform machen
Gif verwendet allerdings Farbpaletten und ist deshalb auf max. 8Bit (256-Farben) beschränkt
|
AW: Screenshot vom Clientbereich der Mainform machen
Hallo,
Danke für die Antworten! Ich wollts jetzt eigentlich nicht glauben, das jpg "schlechtere" Bilder erzeugt. Deswegen hab ich einen Screenshot erzeugt und den gleichzeitig als jpg und als png gespeichert. So war ein direkter Vergleich möglich! - und siehe da - da ist echt ein großer Unterschied - vor allem bei Schriften! Dann werd ich bei png bleiben. |
AW: Screenshot vom Clientbereich der Mainform machen
JPEG speichert Bilder eben verlustbehaftet.
Bei Fotos und anderen Bildern, mit sehr vielen Farben, wo es nicht auf jedes Pixel ganz genau drauf ankommt, komprimiert es dafür besser, da es einfach "unwichtige" Informationen wegläßt. (macht MP3 ja auch und da beschwert sich fast niemand) ![]() |
AW: Screenshot vom Clientbereich der Mainform machen
Auch bei 100% ist das dann verlustbehaftet. Dann besser auf verlustfreies Kompressionsverfahren setzen (Z.B. PNG)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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-2025 by Thomas Breitkreuz