Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сеть, передача изображения [D7, XP]


Страницы:   1 2

Sania ©   (2006-04-06 11:30:00) 

Возникла проблемка, чтобы передать рисунок по сети нужно загнать его в Tstream (с помощью TidTCPserver можно вроде тока Tstream или файл передать), а перевод TjpegImage в Tstream занимает ДОФИГА времени (средняя картинка переводится за 0,5 сек при загрузке компа), может можно как-нить обойти это? Обратный перевод занимает в 5 раз меньше времени.


Sergio77   (2006-04-17 16:43:00) [1]

как передать bitmap?
там типы разные...


Гарри Поттер   (2006-04-14 23:22:00) [2]

> Sania ©   (10.04.06 13:15) [18]
> jpeg!!! - я не знаю, как он сжал, но это факт (просто это
> наименьший из полученых обьемов, снятый с "рабочего")

Размер jpeg зависит от количества переходов цветов заюзаных в картинке. Чем "цветастее" картинка - тем больше вес. Однотонное изображение  800х600 с максимальным качеством будет весить ~40кб. Если извратится - раскрасить каждый пиксел в разные цвета и сохранить с макс.качеством в jpg, то размер будет сопоставим с bmp.
Если скриншот состоит из однотонного рабочего стола и таскбара, то наверное будет где-то ~64kb


Sania   (2006-04-14 11:57:00) [3]

Вроде так, хотя не проверил...

procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var S:tMemoryStream;
begin
IdTCPClient1.Connect(100);

//Отправить просто файл
IdTCPClient1.WriteFile('C:\DemoFile.txt');

//Отправить поток
s:=tMemoryStream.Create;
s.LoadFromFile('C:\DemoFile.txt');
IdTCPClient1.WriteStream(S);
s.Free;

//Прочитать файл
s:=tMemoryStream.Create;
IdTCPClient1.ReadStream(s);
s.SaveToFile('C:\1.txt');
s.Free;

IdTCPClient1.Disconnect;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
Var S:tMemoryStream;
begin
With AThread.Connection do
 Begin
 //Прочитать файл
 s:=tMemoryStream.Create;
 ReadStream(S);
 s.SaveToFile('C:\1.txt');
 s.Free;

 s:=tMemoryStream.Create;
 ReadStream(S);
 s.SaveToFile('C:\1.txt');
 s.Free;

 //Отправить файл
 WriteFile('C:\DemoFile.txt');
 Disconnect;
 End;
end;


Sergio77   (2006-04-13 13:46:00) [4]

встречный вопрос:

а как ты вообще посылаешь.принимаешь с помощью indy?
если не сложно, то кусочек кода пожалуйста..


Sania   (2006-04-13 11:54:00) [5]

MakeScreenshot тянет 70 кадров в секунду при примерно 0 загрузке цп, а то, что я напечатал - 2 кадра при 60-80%


kami   (2006-04-10 19:59:00) [6]

Sania ©   (10.04.06 12:49) [16]
Никакой разницы в скрорости я не заметил

а зря, сжимает гораздо быстрее(из собственного опыта), но алгоритм в принципе верный, если в MakeScreenshot нет больших заморочек.

VNC-ссылочки нет под рукой
Сам не помню, но есть куча поисковиков


Сергей М.   (2006-04-10 13:36:00) [7]


> не знаю, как он сжал


Да как бы он ни сжал, но уж точно не для


> 100% передача качества


Sania   (2006-04-10 13:15:00) [8]

jpeg!!!- я не знаю, как он сжал, но это факт (просто это наименьший из полученых обьемов, снятый с "рабочего")


Сергей М.   (2006-04-10 13:02:00) [9]


> 600*800 (глубина вроде 24)


600*800*3 = 1440000 байт.

А ты утверждаешь, что


> в районе 64 кб


Вопрос тебе на засыпку - куда делись еще более миллиона байт ?


Sania   (2006-04-10 12:49:00) [10]

Ты имел в виду вот это

procedure TMainForm.Timer1Timer(Sender: TObject);
Var bmp:tbitmap;m:tmemorystream;
begin
bmp:=tbitmap.Create;
MakeScreenshot(bmp);
m:=tmemorystream.Create;
bmp.SaveToStream(m);
// Бла бла бла, сжать, отправить
bmp.Free;
m.Free;
end;

Никакой разницы в скрорости я не заметил
VNC-ссылочки нет под рукой


kami   (2006-04-08 20:09:00) [11]

При "впихивании" BITMAP в поток ничего особенного не вызывается, а вот jpeg, представленного в памяти битмапом...
Запись jpeg в поток - действительно очень долгая процедура, поэтому проще в поток сохранить сам битмап, а не jpeg и потом сжать чем-нибудь типа ZLib. Объем 800х600x32b получается около 200кб(default степень компрессии), что вполне приемлимо для передачи по локалке и причем сжатие идет несравнимо быстрее.

VNC - это программа удаленного администрирования с открытым исходным кодом на C. В ней можно посмотреть алгоритм "вычисления" изменившихся участков рабочего стола, что избавляет от передычи каждый раз полного экрана.


Sania   (2006-04-08 09:45:00) [12]

Не, ты не понял, главная проблемма не в передаче потока по сети, а во впихивании битмапа в поток (он там сам каку-то процедуру сжатия начинает вызывать и она то и тормозит все).
Tight VNC-это че и где?


kami   (2006-04-07 21:59:00) [13]

1.Сжимать битмап, сохраненный в поток ZLib-ом.
2.Действительно не передавать полный экран (исходники Tight VNC в руки).


Sania   (2006-04-07 15:33:00) [14]

jpeg-картинка скрина 600*800 (глубина вроде 24)


Сергей М.   (2006-04-07 13:28:00) [15]

И какого же размера jpeg-картинка (и при какой глубине цвета) у тебя при этом уместилась в 64кб, как ты утверждаешь, "без компресии" ?


Sania   (2006-04-07 13:23:00) [16]

TjpegImage.CompressionQuality=100
т.е. 100% передача качества


Сергей М.   (2006-04-07 13:09:00) [17]


> JPEG-говский скрееншот без компрессии весит в районе 64
> кб


"нипонял" ..

JPEG-формат сам по себе подразумевает компрессию ..

Что значит "без компрессии" ?


Sania   (2006-04-07 12:55:00) [18]

Реализуй адаптивное кодирование изменений кадров.
НИПОНЯЛ...
Вопрос стоит не вкорости передачи по сети, а в скорости записи в поток.
JPEG-говский скрееншот без компрессии весит в районе 64 кб


Сергей М.   (2006-04-07 10:57:00) [19]


> И че, вся эта шняга будет работать быстрее??


Догадайся с 3-х раз, что будет быстрей - сжать/передать, скажем, 4 мб или 4 кб данных ?

И разве на JPEG свет клином сошелся ?


> динамичной графикой


Реализуй адаптивное кодирование изменений кадров.


Sania   (2006-04-07 10:45:00) [20]

И че, вся эта шняга будет работать быстрее??
И потом много ли ты сравнишь, когда запущена прога с динамичной графикой.
Еще не видел проги, вот динамичную графику передавала с низкой загрузкой ЦП.
Может можно поток, идущий на монитор перенаправить??


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо