Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2018, 20:55   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию TMemoryStream Отправка картинки от сервера клиенту

Всем доброго времени суток. Пишу программу, которая должна передавать картинки bmp с заданной частотой от сервера клиенту (idtcpserver, idtcpclient). Indy Delphi 7.

На этапе сервера картинка создается и если ее сохранять на винчестер перед отправкой - она отлично отображается. Но вот через поток картинка передается на клиента и такое ощущение что вместо картинки с таким же размером передается какой-то бред. Суть в том, что получив поток, я его сохраняю в формате bmp (итоговый размер конечно же совпадает), но сохраненная картинка не может быть отображена в виндовс. А если ее загрузить программно - пишет "bitmap is not valid". Помогите правильно передавать картинки.

Несколько дней не могу решить проблему, пробовал разные варианты.

Во многих вариантах еще и утечки памяти есть постоянные, частично проблемы с ними решил, частично буду потом разбираться дальше.

Сервер:
Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
S:string; MemStream:TMemoryStream;
begin
  S:=AThread.Connection.ReadLn;

  if s='@' then
  begin
    MemStream:=TMemoryStream.Create;
    try
    MemStream.Position := 0;
    MemStream.Size:=0;
  
    FormatBmp.Assign(img1.Picture);
    FormatBmp.SaveToStream(MemStream);
    FormatBmp.SaveToFile('c:\b.bmp');
    SizeFile:=MemStream.Size;
   
    AThread.Connection.Writeln(inttostr(SizeFile));
    AThread.Connection.OpenWriteBuffer();
    AThread.Connection.WriteStream(MemStream, True,True);
    AThread.Connection.CloseWriteBuffer();

    finally
    MemStream.Size:=0;
    end;
  MemStream.Free;

  end;

end;
Клиент (по таймеру запрашивает картинки):
Код:
    try
    IdTCPClient1.Host:=Edit1.Text;
    IdTCPClient1.Port:=8778;
    IdTCPClient1.Connect();
    IdTCPClient1.WriteLn('@');
    s:=IdTCPClient1.ReadLn;
    SizeFile:=StrToInt(s);
    S:='';
       MemStream:=TMemoryStream.Create;

      IdTCPClient1.ReadStream(MemStream,SizeFile,False);
      
      MemStream.SaveToFile('c:\a.bmp');
      FormatBmp.LoadFromFile('c:\a.bmp');
      Img1.Picture.Assign(FormatBmp);
      MemStream.Size:=0;

    finally

      IdTCPClient1.Disconnect;
    end;
    MemStream.Free;
Armageddets вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка с сервера информацию клиенту JanCover Общие вопросы по Java, Java SE, Kotlin 3 05.10.2016 10:08
Ответ от сервера клиенту primerb C++ Builder 0 10.05.2015 18:43
Передача формы по сети от сервера к клиенту prizrak1390 Работа с сетью в Delphi 11 03.11.2014 19:02
Отправка сообщения с сервера клиенту. securus Работа с сетью в Delphi 0 31.08.2010 03:32
Проблема с отправкой MemoryStream от сервера к клиенту Ragnarek Работа с сетью в Delphi 4 07.02.2009 10:29