Entwickler-Ecke

Internet / Netzwerk - Code für Stream vereinfachen


Anonymous - Di 13.05.03 11:51
Titel: Code für Stream vereinfachen
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:


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 - 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


Anonymous - 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 - Di 13.05.03 12:28

Ok, hier ein Beispiel, wie du eine beliebige Graphik in eine JPG-Grafik konvertierst:


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