Entwickler-Ecke
Multimedia / Grafik - Delphi Screenshot Bereich
HenryHux - Mi 22.09.10 17:21
Titel: Delphi Screenshot Bereich
Hi,
ich habe ein Problem mit einem Screenshot Programm.
Hab ich hier aus dem Forum =)
Und zwar ich habe Koordinaten vom Screen aber immer nur 2. Wie trage ich die hier ein?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var DeskCanvas: TCanvas; DeskRect: TRect; begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); DeskRect.Left := 382; DeskRect.Top := 457; DeskRect.Right := 400; DeskRect.Bottom := 400; Image1.Canvas.CopyRect(Image1.ClientRect, DeskCanvas, DeskRect); DeskCanvas.Free; end; |
Danke =)
Lg
Henry
Moderiert von
Martok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 22.09.2010 um 18:14
bummi - Mi 22.09.10 18:03
Hilft Dir das, oder gibt es ein anderes Problem?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm5.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(10,10,100,100),1); GetShoot2Image(image2,Rect(10,10,100,100),0.5); GetShoot2Image(image3,Rect(10,10,100,100),2); end; |
HenryHux - Mi 22.09.10 18:13
Danke erstmal, klappt soweit mit dem screenshot.
Aber wenn ich zb. die Koordinaten 380 und 450 hab, wie gebe ich die dann ein? Hab von Bildern in Delphi kaum Ahnung.
Danke nochmal =)
bummi - Mi 22.09.10 18:19
Pseudocode.....
GetShoot2Image(image1,Rect(380,450,380 + breite,450 + höhe),1);
HenryHux - Mi 22.09.10 19:37
Ok, Danke hat super geklappt!
Aber wenn ich jetzt hier das Bild speichern will von Image1, wie klappt das?
Hier nochmal der Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm1.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1); end;
procedure TForm1.Button2Click(Sender: TObject); Image1.Picture.SaveToFile('c:\'); end; |
PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an.
jaenicke - Mi 22.09.10 19:59
HenryHux hat folgendes geschrieben : |
Aber wenn ich jetzt hier das Bild speichern will von Image1, wie klappt das? |
Das Image wird doch als Parameter an die Prozedur übergeben. Und das ist in deinem Fall ja auch Image1. :gruebel:
HenryHux hat folgendes geschrieben : |
PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an. |
Wenn du in der Prozedur auf Image1 zugreifen willst, solltest du eine Methode deines Formulars daraus machen. Also so wie der Buttonklick, der auch zum Formular gehört.
HenryHux - Mi 22.09.10 20:05
Ok un wie würde das dann ungefähr aussehen?
Delphi-Quelltext
1:
| procedure Tform1.Image1.Picture.SavteToFile (Filename: String); |
Oder so? Klappt aber auch nicht...
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TFormImage(Sender: TObject); VAR Bitmap : TBitmap; Filename : string; begin Image1.Picture.SavteToFile (Filename: String); end; |
Danke =)
jaenicke - Mi 22.09.10 20:26
Wie gesagt: Hier wird Image1 ohnehin schon an die Prozedur übergeben und benutzt. Deshalb verstehe ich nicht das Problem...
Um eine Prozedur als Methode dem Formular hinzuzufügen musst du das entsprechend machen wie auch bei dem Buttonklick usw.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TFormX = class(TForm) ... private procedure MyMethod(); end;
...
implementation
...
procedure TFormX.MyMethod(); begin
end; |
Du musst also in der Deklaration des Formulars die Methode als zum Formular gehörig deklarieren. Genauso musst du bei der Implementierung auch dazuschreiben, dass die Methode zum Formular gehört.
HenryHux - Mi 22.09.10 20:34
Wow danke ;)
Klappt perfekt.
Tja das Schuldelphi behandelt so Sachen halt nicht :P
Aber zum Verständnis würde mich interessieren wieso ich eine extra Methode anlegen muss, bevor der Befehl Image1.Picture.SaveToFile ('D:\image.bmp'); klappt.
Vielleicht hat ja noch jemand das gleiche Problem wie ich, so hab ich es geschafft =)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm1.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1); end;
procedure TForm1.SaveImage(); begin Image1.Picture.SaveToFile ('D:\image.bmp'); end;
procedure TForm1.Button2Click(Sender: TObject); begin Image1.Picture.SaveToFile ('D:\image.bmp'); end; |
Nochmal ein großes Danke!
Lg
Henry
Btw., tolles Forum!
jaenicke - Mi 22.09.10 20:41
HenryHux hat folgendes geschrieben : |
Aber zum Verständnis würde mich interessieren wieso ich eine extra Methode anlegen muss, bevor der Befehl Image1.Picture.SaveToFile ('D:\image.bmp'); klappt. |
Stell dir einmal vor du möchtest, dass jemand z.B. den Beamer an der anderen Zimmerecke einschaltet. Dann musst du auch sagen, dass derjenige den Schalter des Beamers betätigen soll.
Wenn du nur sagst, dass jemand den Schalter betätigen möchte, weiß derjenige auch nicht welchen.
Genauso ist es hier: Du kannst in der Methode einfach Image1 benutzen, weil Delphi davon ausgeht, dass du das aus deinem eigenen Objekt meinst. Denn du bist ja quasi gerade im Formular.
Wenn du aber außerhalb eine einzelne Prozedur hast, kann Delphi ja nicht wissen, dass du das Image1 in dem Formular meinst. Du kannst in der Unit auch z.B. zwei Klassen mit Image1 darin deklarieren. Deshalb muss Delphi immer herausbekommen können was du eigentlich meinst.
HenryHux - Mi 22.09.10 20:53
Klasse, vielen Dank für die Erklärungen und die Geduld :D
Lg
Henry
HenryHux - Mi 22.09.10 21:08
Aber eine kleine Frage hätte ich doch noch :P
Wie kann ich den Anzeigebreite, also den Bereich der angezeigt wird ändern?
jaenicke - Mi 22.09.10 21:19
Du gibst die Breite im Code ja an. Du kannst auch die Größe des Images ändern.
Oder wie meinst du das sonst?
HenryHux - Mi 22.09.10 21:28
Ja meine, dass mehr Bild gemacht wird.
Also das Bild vergrößern.
Ist das der Faktor?
Moderiert von
Martok: Beiträge zusammengefasst.
Ok glaube unklar ausgedrückt.
Ich will das Bild vertikal ca in der Mitte teilen und nach rechts erweitern ohne das es gestreckt oder gestaucht wird.
Also den Ausschnitt ändern.
Lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!