UDP图像流,Delphi Indy10 [英] Udp image streaming, delphi indy10

查看:251
本文介绍了UDP图像流,Delphi Indy10的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用带有indy10组件的delphi xe4,我想将图像从Tidudpclient发送到Tidudpserver。我已经用tcp组件完成了此操作,但是udp不能使用相同的代码。我该怎么做?
预先感谢!


Timage(client)---> streamUDP-> Timage(server)


客户端--------------------------------- ------------------发送图像

  var 
pic :tbitmap;
Strm:TMemoryStream;
img2:Timage;

buffer:TIdBytes;
开始

尝试
img2:= Timage.Create(nil);
pic:= Tbitmap.Create;
Takekpic(pic);
BMPtoJPG(pic,img2);
Strm:= TMemoryStream.Create;
img2.Picture.bitmap.SaveToStream(strm);
Strm.Position:= 0;
ReadTIdBytesFromStream(Strm,buffer,SizeOf(Strm),0);
IdTrivialFTPServer1.SendBuffer(’192.168.17.128’,1234,buffer);
最终
strm。
结尾;
结尾;

服务器端------------------ ---------------------------------读取图像

 程序TForm6.IdTrivialFTP1UDPRead(AThread:TIdUDPListenerThread; 
const AData:TIdBytes; ABinding:TIdSocketHandle);
var
Strm:TMemoryStream;
Jpg:TJpegImage;

开始
Strm:= TMemoryStream.Create;
try

WriteTIdBytesToStream(Strm,AData,SizeOf(AData),0);
strm.Position:= 0;
Jpg:= TJpegImage.Create;
jpg.LoadFromStream(Strm); < ----读取时出错(JPEG错误#53)
img1.Picture.assign(jpg);
最终
strm。
Jpg。免费;
结尾;
结尾;

这段代码可能出什么问题了?

解决方案

TIdUDPClient TIdUDPServer 不支持发送/接收 TStream 数据。您可以将图像数据保存到 TStream 中,但是必须使用 TIdBytes 块进行发送/接收。 / p>

或者,使用 TIdTrivialFTP TIdTrivialFTPServer 来代替TFTP,基于UDP的文件传输协议。它们使用 TStream 对象



更新进行操作:例如:



客户端:

  var 
bmp:TBitmap;
jpg:TJPEGImage;
Strm:TMemoryStream;
开始
Strm:= TMemoryStream.Create;
试试
jpg:= TJPEGImage.Create;
试试
bmp:= TBitmap.Create;
试试
Takekpic(bmp);
jpg.Assign(bmp);
最终
bmp。免费;
结尾;
jpg.SaveToStream(Strm);
最后
jpg。免费;
结尾;
Strm.Position:= 0;
{
这些可以提前分配...
IdTrivialFTP1.Host:=‘192.168.17.128’;
IdTrivialFTP1.Port:= 1234;
}
IdTrivialFTP1.Put(Strm,‘image.jpg’);
最后
Strm.Free;
结尾;
结尾;

服务器:

  procedure TForm6.IdTrivialFTPServer1WriteFile(Sender:TObject; var FileName:String; const PeerInfo:TPeerInfo; var GrantAccess:Boolean; var AStream:TStream; var FreeStreamOnComplete:Boolean)对象; 
如果文件名= image.jpg,则以
开始,然后

开始
GrantAccess:= True;
AStream:= TMemoryStream.Create;
FreeStreamOnComplete:=真;
结束,否则
GrantAccess:= False;
结尾;

{
如果将TIdTrivialFTPServer.ThreadedEvent设置为False,则此事件处理程序
在主线程的上下文中运行,因此可以安全地访问UI。
如果将IdTrivialFTPServer.ThreadedEvent设置为True,则此事件处理程序
在工作线程的上下文中运行,因此在更新UI时,您将必须手动与主线程同步
。 。
}
过程TForm6.IdTrivialFTPServer1TransferComplete(发送方:TObject; const成功:布尔值; const PeerInfo:TPeerInfo; var AStream:TStream; const WriteOperation:布尔值);
var
jpg:TJPEGImage;
开始
如果WriteOperation and Success然后
开始
jpg:= TJPEGImage.Create;
试试
AStream.Position:= 0;
jpg.LoadFromStream(AStream);
img1.Picture.Assign(jpg);
最后
jpg。免费;
结尾;
结尾;
结尾;


i'm using delphi xe4 with indy10 component and i want to send an image from an Tidudpclient to Tidudpserver. I already done this operation with tcp component,but the same code didn't work with udp. how i can do this? Thanks in advance!

Timage(client)--->streamUDP-->Timage(server)

CLIENT SIDE----------------------------------------------- SEND IMAGE

var
    pic: tbitmap;
       Strm : TMemoryStream;
        img2:Timage;

    buffer:TIdBytes;
    begin

        try
          img2:=Timage.Create(nil);
          pic:=Tbitmap.Create;
          Takekpic(pic);     
          BMPtoJPG(pic,img2);
          Strm := TMemoryStream.Create;
          img2.Picture.bitmap.SaveToStream(strm);
          Strm.Position:=0;
          ReadTIdBytesFromStream(Strm,buffer,SizeOf(Strm),0);
          IdTrivialFTPServer1.SendBuffer('192.168.17.128',1234,buffer);
        finally
             strm.Free;
          end; 
    end;

SERVER SIDE---------------------------------------------------- READ IMAGE

procedure TForm6.IdTrivialFTP1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
    var
Strm : TMemoryStream;
Jpg: TJpegImage;

begin
      Strm := TMemoryStream.Create;
      try    

         WriteTIdBytesToStream(Strm,AData,SizeOf(AData),0);
         strm.Position:=0;
         Jpg := TJpegImage.Create;
         jpg.LoadFromStream(Strm);  <---- error while reading (JPEG Error #53)
         img1.Picture.assign(jpg);
      finally
         strm.Free;
         Jpg.Free;
      end;
end;

what can be wrong in this code?

解决方案

TIdUDPClient and TIdUDPServer do not support sending/receiving TStream data. You can save your image data into a TStream, but you will have to send/receive it using TIdBytes chunks.

Alternatively, use TIdTrivialFTP and TIdTrivialFTPServer instead, which implement TFTP, a UDP-based file transfer protocol. They operate using TStream objects

Update: for example:

Client:

var
  bmp: TBitmap;
  jpg: TJPEGImage;
  Strm : TMemoryStream;
begin
  Strm := TMemoryStream.Create;
  try
    jpg := TJPEGImage.Create;
    try
      bmp := TBitmap.Create;
      try 
        Takekpic(bmp);     
        jpg.Assign(bmp);
      finally
        bmp.Free;
      end;
      jpg.SaveToStream(Strm);
    finally
      jpg.Free;
    end;
    Strm.Position := 0;
    {
    These can be assigned ahead of time...
    IdTrivialFTP1.Host := '192.168.17.128';
    IdTrivialFTP1.Port := 1234;
    }
    IdTrivialFTP1.Put(Strm, 'image.jpg');
  finally
    Strm.Free;
  end; 
end;

Server:

procedure TForm6.IdTrivialFTPServer1WriteFile(Sender: TObject; var FileName: String; const PeerInfo: TPeerInfo; var GrantAccess: Boolean; var AStream: TStream; var FreeStreamOnComplete: Boolean) of object;
begin
  if FileName = 'image.jpg' then
  begin
    GrantAccess := True;
    AStream := TMemoryStream.Create;
    FreeStreamOnComplete := True;
  end else
    GrantAccess := False;
end;

{
If you set TIdTrivialFTPServer.ThreadedEvent to False, this event handler
runs in the context of the main thread, so the UI can be accessed safely.
If you set IdTrivialFTPServer.ThreadedEvent to True, this event handler
runs in the context of a worker thread, so you will have to manually
synchronize with the main thread when updating the UI...
}
procedure TForm6.IdTrivialFTPServer1TransferComplete(Sender: TObject; const Success: Boolean; const PeerInfo: TPeerInfo; var AStream: TStream; const WriteOperation: Boolean);
var
  jpg: TJPEGImage;
begin
  if WriteOperation and Success then
  begin
    jpg := TJPEGImage.Create;
    try
      AStream.Position := 0;
      jpg.LoadFromStream(AStream);
      img1.Picture.Assign(jpg);
    finally
      jpg.Free;
    end;
  end;
end;

这篇关于UDP图像流,Delphi Indy10的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆