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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 19:15   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию Использ. ZLIB для сжатия файла при передаче сервер-клиент

Использование библиотеки Zlib для компрессии-декомпрессии графического файла (BMP) при передаче по сети с использованием архитектуры сервер-клиент на базе INDY10

Есть сервер, делает по запросу клиента захват видеобуфера в формат BMP, записывает в ОЗУ, и передает через сетевой сокет клиенту. Проблема в том что сетевой адаптер загружается по максимуму (частота обращения к серверу 40 мс). надо както сжать передаваемые по сети данные.
вот код сервера (немного упрощенная версия, все лишнее отброшено)
Код:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdContext, StdCtrls, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdTCPServer, ExtCtrls, Zlib;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IPadress: TEdit;
    PortNumber: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GET_SCREEN;
  end;

var
  Form1: TForm1;
  pic : TMemoryStream; //ГлобПЕРЕМ в которой хранится данные скрина экрана

implementation

{$R *.dfm}

procedure TForm1.GET_SCREEN; //Процедура получения скрина экрана
var
  Desktop: TCanvas;
  B: TBitmap;
  W, H :Integer;
  Kursor:TPoint;
  TempRect:TRect;
begin
 GetCursorPos(Kursor);
 W:=Screen.Width;
 H:=screen.Height;
 TempRect:=Rect(Kursor.x,Kursor.y,Kursor.x+10,Kursor.y+10);
 B:=TBitmap.Create;
 B.Width:=W;
 B.Height:=H;

 Desktop:=TCanvas.Create;
 try
  with Desktop do
   Handle := GetWindowDC(GetDesktopWindow);
   with B.Canvas do
    begin
     Brush.Color:=clGreen;
     CopyRect (Rect (0, 0, w, h),
               DeskTop,
               Rect (0, 0, w, h));
     FillRect(TempRect);
    end;
   FreeAndNil(pic);
   pic := TMemoryStream.create;
     B.SaveToStream(pic);  //вот тут данные размещаются в ОЗУ
 finally
  DeskTop.Free;
  B.Free;
 end;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); //Процедура передачи данных клиенту
var
  z: string;
  X,Y:integer;
  K:TPoint;
begin
  with AContext.Connection do
  begin
   z := AContext.Connection.IOHandler.ReadLn;
   if SameText(Copy(z, 1, 11), 'get_screen ') then
   begin
    Log('Запрошен скриншот');
    GET_SCREEN;
      AContext.Connection.IOHandler.WriteBufferOpen(pic.Size);
    Log('Передаем файл s.bmp');

    AContext.Connection.IOHandler.Write(pic);
    Log('Файл передан');
    AContext.Connection.IOHandler.Close;
   end;

   if SameText(Copy(z, 1, 11), 'mouse_move ') then
   begin
    z := AContext.Connection.IOHandler.ReadLn;
    if SameText(Copy(z, 1, 8), 'mouse_x ') then
    X:=StrToInt(Copy(z,9,4));

    z := AContext.Connection.IOHandler.ReadLn;
    if SameText(Copy(z, 1, 8), 'mouse_y ') then
    Y:=StrToInt(Copy(z,9,4));

    Log('Перемещение мыши');
    SetCursorPos(X,Y);
  end;

  if SameText(Copy(z, 1, 11), 'mouse_left ') then
   begin
    GetCursorPos(K);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,K.X,K.Y,0,0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP,K.X,K.Y,0,0);
    Log('Нажатие левой кнопки мыши');
   end;

   if SameText(Copy(z, 1, 12), 'mouse_right ') then
   begin
    GetCursorPos(K);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN,K.X,K.Y,0,0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP,K.X,K.Y,0,0);
    Log('Нажатие правой кнопки мыши');
   end;

  AContext.Connection.Disconnect;
 end;
end;
end.
В общем и целом все работает
Вопрос:
как тут прикрутить сжатие ПЕРЕМ pic в момент передачи ее клиенту по сети с помощью TCompressionStream от ZLib.pas
использование трансформации *.bmp в другие форматы типа *.png не обсуждается, нужен формат файла BMP (для последующей обработки OCR)
Pcrepair вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла клиент-сервер Loveb C/C++ Сетевое программирование 2 27.05.2011 10:10
Вопросы по передаче данных. Синхронный, асинхронный режимы. Коэффициент сжатия. Zyek Помощь студентам 1 22.10.2010 15:47
Виснет машина при передаче файла через сокет SlashMan Работа с сетью в Delphi 2 19.07.2009 23:50
Алгоритм сжатия+ zlib Воин-Леший Общие вопросы Delphi 1 09.12.2007 15:05