[英]Delphi indy streaming Http Server
相機將圖像捕獲到圖像。 想要這張照片可以在http。 我可以以某種方式使用它HTTPServer1CommandGet我顯示一個? 我只想在現場顯示image1的圖像如果是這樣,怎么樣?
如果您只需要在客戶端要求時顯示最新圖像,您可以執行以下操作:
type
TGetImageStream = class(TIdSync)
protected
FStream: TStream;
procedure DoSynchronize; override;
public
class procedure GetImage(Stream: TStream);
end;
procedure TGetImageStream.DoSynchronize;
begin
Form1.Image1.Bitmap.SaveToStream(FStream);
end;
class procedure TGetImageStream.GetImage(Stream: TStream);
begin
with Create do
try
FStream := Stream;
Synchronize;
finally
Free;
end;
end;
procedure TForm1.HTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
Strm: TMemoryStream;
begin
Strm := TMemoryStream.Create;
try
TGetImageStream.GetImage(Strm);
Strm.Position := 0;
except
Strm.Free;
raise;
end;
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentType := 'image/bmp';
AResponseInfo.ContentStream := Strm;
end;
但是如果你需要實時對相機圖像進行實時流式傳輸,那就會變得有點棘手。 你可以用幾種不同的方式做到這一點。 例如,使用客戶端拉:
procedure TForm1.HTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
Strm: TMemoryStream;
begin
if ARequestInfo.Document = '' then
begin
AResponseInfo.Redirect('/');
end
else if ARequestInfo.Document = '/' then
begin
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentType := 'text/html';
AResponseIno.ContentText := '<html>'+EOL+
'<head>'+EOL+
'<title>Camera Image</title>'+EOL+
'<meta http-equiv="Refresh" content=5>'+EOL+
'</head>'+EOL+
'<body>'+EOL+
'<img src="/image">'+EOL+
'</body>'+EOL+
'</html>'+EOL;
end
else if ARequestInfo.Document = '/image' then
begin
Strm := TMemoryStream.Create;
try
TGetImageStream.GetImage(Strm);
Strm.Position := 0;
except
Strm.Free;
raise;
end;
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentType := 'image/bmp';
AResponseInfo.ContentStream := Strm;
end else begin
AResponseInfo.ResponseNo := 404;
end;
end;
改為使用服務器推送:
procedure TForm1.HTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
Strm: TMemoryStream;
begin
Strm := TMemoryStream.Create;
try
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentType := 'multipart/x-mixed-replace; boundary=imgboundary';
AResponseInfo.CloseConnection := False;
AResponseInfo.WriteHeader;
AContext.Connection.IOHandler.WriteLn('--imgboundary');
repeat
Strm.Clear;
TGetImageStream.GetImage(Strm);
AContext.Connection.IOHandler.WriteLn('Content-type: image/bmp');
AContext.Connection.IOHandler.WriteLn;
AContext.Connection.IOHandler.Write(Strm);
AContext.Connection.IOHandler.WriteLn;
AContext.Connection.IOHandler.WriteLn('--imgboundary');
Sleep(5000);
until False;
finally
Strm.Free;
end;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.