Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 27.06.2018, 21:55   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 127
Репутация: 10
По умолчанию 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 вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


06:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru