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);
 // Ausschnitt festlegen
 DeskRect.Left := 382;
 DeskRect.Top := 457;
 DeskRect.Right := 400;
 DeskRect.Bottom := 400;
 // an Image1 übergeben
 Image1.Canvas.CopyRect(Image1.ClientRect, DeskCanvas, DeskRect); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;



Danke =)

Lg

Henry


Moderiert von user profile iconMartok: 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); // Image1 ist auf der Form vorhanden
 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); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1);
//  GetShoot2Image(image2,Rect(10,10,100,100),0.5);
//  GetShoot2Image(image3,Rect(10,10,100,100),2);
end;

procedure TForm1.Button2Click(Sender: TObject);
Image1.Picture.SaveToFile('c:\');   // haben mir ein paar Leute geraten, klappt aber leider nicht
end;



PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an.


jaenicke - Mi 22.09.10 19:59

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1);
//  GetShoot2Image(image2,Rect(10,10,100,100),0.5);
//  GetShoot2Image(image3,Rect(10,10,100,100),2);
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

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconMartok: 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