Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 04.12.10 12:49 
Hi,

ich hab eine Prozedur, die ein Screenshot macht und es schneidet.
Bis jetzt hab ich das immer über TImages alles aufgenommen, da zwischengespeichert, aber würde das lieber mit anderen Objekten machen, erstens zuviel Aufwand mit den Timages und unsicherer.

Sah bis jetzt so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure Screenshot2(image:Timage;Bounds:TRect; Links, Rechts, Oben, Unten, z2 : integer); inline;
var DeskCanvas: TCanvas;
    Cut : TRect;
begin
  try
    DeskCanvas := TCanvas.Create;
    DeskCanvas.Handle := GetDC(0);
    try
      image.Width := Round((Bounds.Right - Bounds.left) * 1);
      image.Height := Round((Bounds.Right - Bounds.Left) * 1);
      Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds);
    finally
      ReleaseDC(0,DeskCanvas.Handle);
    end;
......


Jetzt wollte ich die TImages auf Bitmaps umlegen.
Sähe so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Procedure Screenshot2(image:Timage;Bounds:TRect; Links, Rechts, Oben, Unten, z2 : integer); inline;
var DeskCanvas: TCanvas;
    SourceBitmap : TBitmap;
    TargetBitmap : TBitmap;
    Cut : TRect;
begin
  try
    DeskCanvas := TCanvas.Create;
    DeskCanvas.Handle := GetDC(0);
    try
      sourcebitmap.Width := Round((Bounds.Right - Bounds.left) * 1);
      sourcebitmap.Height := Round((Bounds.Right - Bounds.Left) * 1);
      sourcebitmap.Canvas.CopyRect(sourcebitmap.ClientRect, DeskCanvas, Bounds);  
       //sourcebitmap.ClientRect funktioniert nicht
    finally
      ReleaseDC(0,DeskCanvas.Handle);
    end;


Wie muss ich das umschreiben damit ich TRect auf ein Bitmap bekomme?

Lg

Henry


Moderiert von user profile iconMartok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 04.12.2010 um 18:00
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.12.10 13:45 
Erstens kannst du auch einfach direkt BitBlt nehmen.

Und zweitens musst du einfach nur ein Rechteck mit den Daten zusammenbauen, entweder in einer Variablen vom Typ TRect, die du dann übergibst, oder direkt mit der Funktion Rect.
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 04.12.10 15:36 
Ok, vielen Dank, BitBlt kannte ich nicht, hat aber funktioniert mit ein bisschen Basterlarbeit.
Doch funktioniert es anders als die andere Methode, denn es schneidet einfach den Rand ab.

Die Vorherige:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
      
      main.Image1.Width := Round((Bounds.Right - Bounds.left) * 1);
      main.Image1.Height := Round((Bounds.Right - Bounds.Left) * 1);
      main.image1.Canvas.CopyRect(main.Image1.ClientRect, DeskCanvas, Bounds);
      main.image1.picture.SaveToFile(path+picsavingfolder+'image1.bmp');


Die Neue:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
      
      ShotTargetbitmap.Width := Round((Bounds.Right - Bounds.left) * 1);
      ShotTargetbitmap.Height := Round((Bounds.Right - Bounds.Left) * 1);
      BitBlt(ShotTargetBitmap.Canvas.Handle, 00, bounds.Right, bounds.Bottom, DeskCanvas.handle, bounds.Left, bounds.Top, SRCCOPY);
      ShotTargetbitmap.SaveToFile(path+picsavingfolder+'image1.bmp');


Ich weiß nicht, wo da der Unterschied liegt.
Aber mal im Anhang 2 Bilder, da sieht man, dass die 2te anders läuft, was alles umwirft.
Ne Idee wieso?

Lg

Henry

Methode 1:
methode1

Methode 2:
methode2

EDIT: Irgendwie scheint es ja an dem 2ten und 3ten Parameter zu liegen, wofür stehen die?
Habe immoment keine Hilfe installiert.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.12.10 15:41 
Die Parameter sind Breite und Höhe (als vierter und fünfter Parameter), du musst also auch dort Bounds.Left bzw. Top abziehen.

// EDIT:
Erstens zeigt Delphi die Parameter doch an und zweitens gibt es ja nun auch die Dokumentation:
msdn.microsoft.com/e...dd183370(VS.85).aspx
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 04.12.10 15:55 
Ok, aber die ändern ja nur die X bzw Y Position, so wie ich das jetzt verstanden habe.
Damit wird das Bild ja nicht gestreckt bzw der Ausschnitt größer?

Lg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.12.10 15:57 
Den Parameter für die Breite befüllst du aber z.B. mit Right. Damit ist der eben um Left breiter als er sollte.
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 04.12.10 16:05 
Wenn der Befehl jetzt so aussieht, dann is das ganze Bild nur noch weiß. Generell kann ich für 0,0 einsetzen was ich will, er verschiebt das nur und macht kein volles Bild...
ausblenden Delphi-Quelltext
1:
BitBlt(ShotTargetBitmap.Canvas.Handle, bounds.Left ,bounds.Top, bounds.Right, bounds.Bottom, DeskCanvas.handle, bounds.Left, bounds.Top, SRCCOPY);					
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.12.10 16:23 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Parameter sind Breite und Höhe (als vierter und fünfter Parameter), du musst also auch dort Bounds.Left bzw. Top abziehen.

Für diesen Beitrag haben gedankt: HenryHux
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 05.12.10 13:08 
Danke, so klappt alles und ich habs sogar noch verstanden =)

Lg