Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

Сеть, передача изображения   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.06 c
2-1145359027
sksyat
2006-04-18 15:17
2006.05.07
IdSMTP


2-1145460774
simplelame
2006-04-19 19:32
2006.05.07
FR 3.0


3-1142401925
гога
2006-03-15 08:52
2006.05.07
Копирование данных в компонент RxMemoryData1.


15-1144809637
Skyle
2006-04-12 06:40
2006.05.07
EPL 2, принтеры этикеток


3-1142352897
Taurus
2006-03-14 19:14
2006.05.07
Выбор варианта вычислений