Entwickler-Ecke
Multimedia / Grafik - Tbitmap und TRect
HenryHux - Sa 04.12.10 11:49
Titel: Tbitmap und TRect
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 - Sa 04.12.10 12: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 - Sa 04.12.10 14: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.
jaenicke - Sa 04.12.10 14: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:
http://msdn.microsoft.com/en-us/library/dd183370(VS.85).aspx
HenryHux - Sa 04.12.10 14: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 - Sa 04.12.10 14: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 - Sa 04.12.10 15: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 - Sa 04.12.10 15: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. |
HenryHux - So 05.12.10 12:08
Danke, so klappt alles und ich habs sogar noch verstanden =)
Lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!