Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1134157478
Kot
2005-12-09 22:44
2006.05.07
Работа с gif


1-1143366898
Kolan
2006-03-26 13:54
2006.05.07
Как поместить класс в Dll или пакет?


15-1144999128
kaand
2006-04-14 11:18
2006.05.07
Набор клавиш быстрого запуска в Windows


15-1144844444
tria
2006-04-12 16:20
2006.05.07
Мультиязычность приложения


15-1145028356
Kart S.
2006-04-14 19:25
2006.05.07
TEditWindow (Кто помнит Turbo Vision?)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский