Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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:
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:
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); finally ReleaseDC(0,DeskCanvas.Handle); end; |
Wie muss ich das umschreiben damit ich TRect auf ein Bitmap bekomme?
Lg
Henry Moderiert von Martok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 04.12.2010 um 18:00
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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:
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:
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, 0, 0, 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:
Methode 2:
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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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...
Delphi-Quelltext 1:
| BitBlt(ShotTargetBitmap.Canvas.Handle, bounds.Left ,bounds.Top, bounds.Right, bounds.Bottom, DeskCanvas.handle, bounds.Left, bounds.Top, SRCCOPY); |
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 04.12.10 16:23
jaenicke hat folgendes geschrieben : | 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: So 05.12.10 13:08
Danke, so klappt alles und ich habs sogar noch verstanden =)
Lg
|
|
|