Форум: "Начинающим";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
ВнизСеть, передача изображения Найти похожие ветки
← →
Sania (2006-04-06 11:30) [0]Возникла проблемка, чтобы передать рисунок по сети нужно загнать его в Tstream (с помощью TidTCPserver можно вроде тока Tstream или файл передать), а перевод TjpegImage в Tstream занимает ДОФИГА времени (средняя картинка переводится за 0,5 сек при загрузке компа), может можно как-нить обойти это? Обратный перевод занимает в 5 раз меньше времени.
← →
Сергей М. © (2006-04-06 11:41) [1]В справке сказано:
SaveToStream expects jpeg image data and may incur overhead of a compression cycle if the source is a bitmap
Те самые 0,5 сек и есть, очевидно, упомянытый в справке overhead.
> можно как-нить обойти это?
Согласно справке можно, если выполнить условие : the source is not a bitmap
← →
Sania (2006-04-07 06:38) [2]Отлично, но как перевести bitmap в не bitmap за 50 мс??
← →
Сергей М. © (2006-04-07 09:13) [3]
> Sania (07.04.06 06:38) [2]
Ты скриншоты что ли передаешь таким образом ?
← →
Sania (2006-04-07 10:00) [4]ага
← →
Сергей М. © (2006-04-07 10:19) [5]Нет никакого резона передавать полный скриншот.
Разбивай очередной скриншот на прямоугольные области, сравнивай содержимое каждой области с содержимым соответствующей области в предыдущем скриншоте, сжимай и передавай только те области, содержимое которых изменилось.
← →
Sania (2006-04-07 10:45) [6]И че, вся эта шняга будет работать быстрее??
И потом много ли ты сравнишь, когда запущена прога с динамичной графикой.
Еще не видел проги, вот динамичную графику передавала с низкой загрузкой ЦП.
Может можно поток, идущий на монитор перенаправить??
← →
Сергей М. © (2006-04-07 10:57) [7]
> И че, вся эта шняга будет работать быстрее??
Догадайся с 3-х раз, что будет быстрей - сжать/передать, скажем, 4 мб или 4 кб данных ?
И разве на JPEG свет клином сошелся ?
> динамичной графикой
Реализуй адаптивное кодирование изменений кадров.
← →
Sania (2006-04-07 12:55) [8]Реализуй адаптивное кодирование изменений кадров.
НИПОНЯЛ...
Вопрос стоит не вкорости передачи по сети, а в скорости записи в поток.
JPEG-говский скрееншот без компрессии весит в районе 64 кб
← →
Сергей М. © (2006-04-07 13:09) [9]
> JPEG-говский скрееншот без компрессии весит в районе 64
> кб
"нипонял" ..
JPEG-формат сам по себе подразумевает компрессию ..
Что значит "без компрессии" ?
← →
Sania (2006-04-07 13:23) [10]TjpegImage.CompressionQuality=100
т.е. 100% передача качества
← →
Сергей М. © (2006-04-07 13:28) [11]И какого же размера jpeg-картинка (и при какой глубине цвета) у тебя при этом уместилась в 64кб, как ты утверждаешь, "без компресии" ?
← →
Sania (2006-04-07 15:33) [12]jpeg-картинка скрина 600*800 (глубина вроде 24)
← →
kami © (2006-04-07 21:59) [13]1.Сжимать битмап, сохраненный в поток ZLib-ом.
2.Действительно не передавать полный экран (исходники Tight VNC в руки).
← →
Sania © (2006-04-08 09:45) [14]Не, ты не понял, главная проблемма не в передаче потока по сети, а во впихивании битмапа в поток (он там сам каку-то процедуру сжатия начинает вызывать и она то и тормозит все).
Tight VNC -это че и где?
← →
kami © (2006-04-08 20:09) [15]При "впихивании" BITMAP в поток ничего особенного не вызывается, а вот jpeg, представленного в памяти битмапом...
Запись jpeg в поток - действительно очень долгая процедура, поэтому проще в поток сохранить сам битмап, а не jpeg и потом сжать чем-нибудь типа ZLib. Объем 800х600x32b получается около 200кб(default степень компрессии), что вполне приемлимо для передачи по локалке и причем сжатие идет несравнимо быстрее.
VNC - это программа удаленного администрирования с открытым исходным кодом на C. В ней можно посмотреть алгоритм "вычисления" изменившихся участков рабочего стола, что избавляет от передычи каждый раз полного экрана.
← →
Sania © (2006-04-10 12:49) [16]Ты имел в виду вот это
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-ссылочки нет под рукой
← →
Сергей М. © (2006-04-10 13:02) [17]
> 600*800 (глубина вроде 24)
600*800*3 = 1440000 байт.
А ты утверждаешь, что
> в районе 64 кб
Вопрос тебе на засыпку - куда делись еще более миллиона байт ?
← →
Sania © (2006-04-10 13:15) [18]jpeg!!! - я не знаю, как он сжал, но это факт (просто это наименьший из полученых обьемов, снятый с "рабочего")
← →
Сергей М. © (2006-04-10 13:36) [19]
> не знаю, как он сжал
Да как бы он ни сжал, но уж точно не для
> 100% передача качества
← →
kami © (2006-04-10 19:59) [20]Sania © (10.04.06 12:49) [16]
Никакой разницы в скрорости я не заметил
а зря, сжимает гораздо быстрее(из собственного опыта), но алгоритм в принципе верный, если в MakeScreenshot нет больших заморочек.
VNC-ссылочки нет под рукой
Сам не помню, но есть куча поисковиков
← →
Sania © (2006-04-13 11:54) [21]MakeScreenshot тянет 70 кадров в секунду при примерно 0 загрузке цп, а то, что я напечатал - 2 кадра при 60-80%
← →
Sergio77 (2006-04-13 13:46) [22]встречный вопрос:
а как ты вообще посылаешь.принимаешь с помощью indy?
если не сложно, то кусочек кода пожалуйста..
← →
Sania © (2006-04-14 11:57) [23]Вроде так, хотя не проверил...
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;
← →
Гарри Поттер © (2006-04-14 23:22) [24]> Sania © (10.04.06 13:15) [18]
> jpeg!!! - я не знаю, как он сжал, но это факт (просто это
> наименьший из полученых обьемов, снятый с "рабочего")
Размер jpeg зависит от количества переходов цветов заюзаных в картинке. Чем "цветастее" картинка - тем больше вес. Однотонное изображение 800х600 с максимальным качеством будет весить ~40кб. Если извратится - раскрасить каждый пиксел в разные цвета и сохранить с макс.качеством в jpg, то размер будет сопоставим с bmp.
Если скриншот состоит из однотонного рабочего стола и таскбара, то наверное будет где-то ~64kb
← →
Sergio77 (2006-04-17 16:43) [25]как передать bitmap?
там типы разные...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c