![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сеть, передача изображения [D7, XP]
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]И че, вся эта шняга будет работать быстрее??
И потом много ли ты сравнишь, когда запущена прога с динамичной графикой.
Еще не видел проги, вот динамичную графику передавала с низкой загрузкой ЦП.
Может можно поток, идущий на монитор перенаправить??