Screenshot in Bitmap speichern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Screenshot in Bitmap speichern

Beitrag von br_klaus »

Hallo, bei meinen Versuchen, Screenshots in eine Bitmap zu übertragen, habe ich die Möglichkeit gefunden, das über die Canvas einer Bitmap zu machen mittels canvas.copyRect (die Bitmap wurde schon vorher erstellt):

Code: Alles auswählen

procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
  var w,h:integer;
   // CopyRect(DestRect, SrcCanvas, SrcRect)
  begin w:=200; h:=200;
    bitmap.setsize(w,h);
    bitmap.Canvas.CopyRect(Rect(0,0,w,h), canvas, Rect(-left, -top, w-left, h-top);
   canvas.draw(x,y,bitmap);
  end;
Damit wird auf dem canvas der form1 ein 200x200 Schreenshot der linken oberen Ecke gemalt. (Man kann damit auch verkleinern und vergrößern und verzerren, je nach den Unterschieden zwischen DestRect und SrcRect.

Es gibt da nur ein Problem: Die Werte (0,0) ergeben nicht exakt die obere linke Ecke des Bildschirms, sondern etwa 30 Pixel darüber, sodaß die ersten 30 Pixel-Zeilen nicht mitgelesen werden. Das liegt daran, daß die Zählung der y-Position in der Form erst etwa 30 Pixel oberhalb des äußeren Randes beginnt (nämlich oberhalb der Titelzeile). Gibt es eine Möglichkeit, die Dicke dieser Zeile zu bekommen? Ich könnte es mit Iteration machen (Beginn mit (-35,0) und dann jeweil ein Pixel dekrementieren, bis die erste Pixel-Zeile nicht mehr schwarz ist), aber vielleicht gibt es auch eine Variable, die diesen Wert angibt (borderwidth scheint nur die Dicke der anderen drei Seiten zu betreffen)?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Screenshot in Bitmap speichern

Beitrag von MAC »

es gibt eine methode der lazaruswiki (im momment bei mir offline)

Code: Alles auswählen

Image1.Picture.Bitmap.LoadFromDevice(GetDC(0));

Code: Alles auswählen

Signatur := nil;

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Screenshot in Bitmap speichern

Beitrag von br_klaus »

Aber wie kann ich einen bestimmten Ausschnitt des Desktops einem Device zuweisen?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Screenshot in Bitmap speichern

Beitrag von Socke »

br_klaus hat geschrieben:Aber wie kann ich einen bestimmten Ausschnitt des Desktops einem Device zuweisen?
Gar nicht. Du lädst das gesamte Bild von dem Bildschirm und kopierst dann den Bereich, der dich interessiert.
br_klaus hat geschrieben:Es gibt da nur ein Problem: Die Werte (0,0) ergeben nicht exakt die obere linke Ecke des Bildschirms, sondern etwa 30 Pixel darüber, sodaß die ersten 30 Pixel-Zeilen nicht mitgelesen werden. Das liegt daran, daß die Zählung der y-Position in der Form erst etwa 30 Pixel oberhalb des äußeren Randes beginnt (nämlich oberhalb der Titelzeile). Gibt es eine Möglichkeit, die Dicke dieser Zeile zu bekommen? Ich könnte es mit Iteration machen (Beginn mit (-35,0) und dann jeweil ein Pixel dekrementieren, bis die erste Pixel-Zeile nicht mehr schwarz ist), aber vielleicht gibt es auch eine Variable, die diesen Wert angibt (borderwidth scheint nur die Dicke der anderen drei Seiten zu betreffen)?
Willst du ein Screenshot deines Fenster anfertigen oder auch Bereiche außerhalb deines Fensters kopieren? Bei ersterem siehe oben, ansonsten kannst du mit

Code: Alles auswählen

Image1.Canvas.CopyRect(Image1.ClientRect, Form1.Canvas, Form1.ClientRect);
auch direkt den Canvas eines Formulars kopieren.
Zuletzt geändert von Lori am Do 5. Mai 2011, 00:24, insgesamt 1-mal geändert.
Grund: Highlighter
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten