Autor Beitrag
Ak-Alex
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 13.05.03 11:51 
Hi, ich habe ein kleines Screengrabber Programm geschrieben, es funktioniert, aber leider über viele Umwege. Vielleicht gibt es jemanden der mir helfen kann den Code zu vereinfachen...

Mein Programm ist so aufgebaut....

1. Bild wird geschossen und in c:\anna.bmp gespeichert
2. Bild wird in Stream geladen und an den Server geschickt...
3. Schleife alle 3 sekunden

3. ServerProgramm holt sich den Stream, speichert ihn auch in einer Datei...
4. ServerProgramm lädt das neue Bild
5. Schleife alle 5 Sekunden


Hier der Code:

ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
unit strmdem;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMStrm,
  ExtDlgs, StdCtrls, Psock, ExtCtrls, ComCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Button1: TButton;
    NMStrm1: TNMStrm;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    ServerSocket1: TServerSocket;
    procedure Button1Click(Sender: TObject);
    procedure NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure NMStrm1Connect(Sender: TObject);
    procedure NMStrm1Disconnect(Sender: TObject);
    procedure NMStrm1HostResolved(Sender: TComponent);
    procedure NMStrm1Status(Sender: TComponent; Status: String);
    procedure NMStrm1PacketSent(Sender: TObject);
    procedure NMStrm1InvalidHost(var handled: Boolean);
    procedure NMStrm1ConnectionFailed(Sender: TObject);
   
    procedure NMStrmServ1Status(Sender: TComponent; Status: String);
    procedure Timer1Timer(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
function GetScreenShot: TBitmap; 
var 
  Desktop: HDC; 
begin 
  Result  := TBitmap.Create; 
  Desktop := GetDC(0); 
  try 
    try 
      Result.PixelFormat := pf32bit; 
      Result.Width       := Screen.Width; 
      Result.Height      := Screen.Height; 
      BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY); 
      Result.Modified := True; 
    finally 
      ReleaseDC(0, Desktop); 
    end; 
  except 
    Result.Free; 
    Result := nil; 
  end; 
end; 

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
  strm: TStream);
var
  MyFStream: TFileStream;
begin
  If FileExists('c:\anna.bmp') then DeleteFile('c:\anna.bmp');
  MyFStream := TFileStream.Create('c:\anna.bmp', fmcreate);
    try
    MyFStream.CopyFrom(strm, strm.size);
  finally
    MYFStream.Free;
  end;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If FileExists('c:\anna.bmp') then DeleteFile('c:\anna.bmp');
end;

procedure TForm1.NMStrm1Connect(Sender: TObject);
begin
  StatusBar1.SimpleText := 'Connected';
end;

procedure TForm1.NMStrm1Disconnect(Sender: TObject);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := 'Disconnected';
end;

procedure TForm1.NMStrm1HostResolved(Sender: TComponent);
begin
  StatusBar1.SimpleText := 'Host Resolved';
end;

procedure TForm1.NMStrm1Status(Sender: TComponent; Status: String);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := status;
end;

procedure TForm1.NMStrm1PacketSent(Sender: TObject);
begin
  StatusBar1.SimpleText := IntToStr(NMStrm1.BytesSent)+' of '+IntToStr(NMStrm1.BytesTotal)+' sent';
end;

procedure TForm1.NMStrm1InvalidHost(var handled: Boolean);
var
  TmpStr: String;
begin
  If InputQuery('Invalid Host!', 'Specify a new host:', TmpStr) then
  Begin
    NMStrm1.Host := TmpStr;
    Handled := TRUE;
  End;
end;

procedure TForm1.NMStrm1ConnectionFailed(Sender: TObject);
begin
  ShowMessage('Connection Failed');
end;



procedure TForm1.NMStrmServ1Status(Sender: TComponent; Status: String);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := status;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  MyFStream: TFileStream;
begin
DeleteFile('c:\anna.bmp');
   Image1.Picture.Bitmap := GetScreenShot;
   Image1.Picture.SaveToFile('c:\anna.bmp');

    NMStrm1.Host := Edit2.Text;
    NMStrm1.FromName := Edit1.Text;
    MyFStream := TFileStream.Create('c:\anna.bmp',fmopenreadwrite);
    try
      NMStrm1.PostIt(MyFStream);
    finally
      MyFStream.Free;
    end;

  NMStrm1.Disconnect;
  end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  s := Socket.ReceiveText;
  if s = 'start' then Button1.Click;
end;

end.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 13.05.03 11:58 
Hi!

Anstelle die ganze Zeit die HD als Puffer zu nutzen, solltest du die Daten direkt versenden. Dafür gibt es die Routine TPicture.Graphic.SaveToStream/LoadFromStream. Evtl. wäre auch eine Verwendung von JPEGs angebracht, damit die Leitung nicht übermäßig strapaziert wird.

Cu,
Udontknow
Ak-Alex
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 13.05.03 12:00 
Titel: Wie genau soll ich das machen?
Ich weiß nur wie ich ein ScreenShot per bmp datei mache....

Postet doch bitte mal nen Code
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 13.05.03 12:28 
Ok, hier ein Beispiel, wie du eine beliebige Graphik in eine JPG-Grafik konvertierst:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var MyJPG:TJPEGImage;
begin
  MyJPG:=TJPEGImage.Create;
  try
    MyJPG.Assign(Image1.Picture.Graphic);
    MyJPG.SaveToFile('C:\Test.jpg');
    Image2.Picture.LoadFromFile('C:\Test.jpg');
  finally
    MyJPG.Free;
  end;
end;


Aber wie gesagt, nimm den Teil mit SaveToFile heraus und sende lieber sofort die Daten per SaveToStream an deinen SocketStream.

Cu,
Udontknow
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!