Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

Remote Admin - отображение полученных кадров(картинок)   Найти похожие ветки 

 
neodiX   (2002-12-17 20:38) [0]

Всем привет!
Проблема состоит не в том, как принять/отаслать image"и экрана, а как и их отображать... Проблема на примере: первый кадр у меня десктоп, получил, нарисовал - база есть, когда я получаю следующий image, предположим окна, я запоминаю у себя на форме (где нарисован десктоп) координаты, куда будет рисоватся окно, что бы потом когда я получил новый кадр после перерисовки нарисвать вместо бывшего окна пустое место т.е. десктоп, а в новом месте новый кадр. Все получается когда работа идет с одним окном, но как появляется больше 2, то все - облом, что мне все места запоминать? Абсурд! Так вот я мастеров графики спрашиваю: "Может можно как нибудь нарисовать картинку на форме, а потом рисуя на ней(ну как бы над ней) что угодно, что бы она не затиралась ?".
P.S. Есть пример в делфи, "EarthPng" в папке source,там земля и падл заранее описаны, для них и канва и дц созданы, а в моем варианте етих обьектов (земель всяких) в одно время может быть хоть море. Как быть мастера?
P.S. А может я вообще не так это отображение представляю? Ни в ту сторону капаю...? Может у кого есть лучше предложения? Если кто сталкивался с этой проблемой и решил, всегда жду есходников.
Заранее всем спасибо.


 
neodiX   (2002-12-18 14:28) [1]

I can"t believe it!
Neuzeli nikto ne stalkivalsia s pohozei problemoi?


 
AlexT1000   (2002-12-18 17:54) [2]

а можно еще разок и внятно написат ьчто тебе нужно.
а то какой-то непонятный набор слов идет


 
neodiX   (2002-12-18 18:15) [3]

Sorry for latin.
Nu poprobuju...
Predstav"... u tebia na forme narisovan desktop, a ty polucaesh pervyi kadr(image), potom vtoroj, tretii i t.d.. Ih vse nado otobrazat" na etom desktope kak okna(windowskie), esli srazu risovat, to kak potom vostonovit izobrazenie desctop"a, ono zarisuetsia etimi oknami... Nado risovat" ne zatiraja desktop. Vrode kak to nado ispolzovat SelectObject, createcompatibleDc i t.d. no ja neznaju kak :( vot i spashivaju.

P.S. esli vsio eshio ne poniatno skazi, u menia seicas vremia netu (ja ne doma), togda objasniu podrobnee i na russkom.


 
AlexT1000   (2002-12-18 19:05) [4]

т.е тебе нужно отображать какбы послойное изображение ?!

если так . то для этого тебе прийдется хранить все твои битмапы и каждый раз перерисовывать их все заново.

т.е. имеем
TLayer = record
X,Y : integer;
Bitmap : Tbitmap;
end;

Bitmap делать pf24bit
Bitmap.PixelFormat := pf24bit;

List : TList ;

List.Add(Layer1);
List.Add(Layer2); ...... где ты хранишь все битмапы которые нужно отрисовать и их координаты.


создаешь канву в начале проги
MyCanvas := TCanvas.Create;


теперь отрисовка

Canvas.FillRect(rect(0,0,ClientWidth,ClientHeight));
for i:=0 to Lis.Count -1 do with TLayerList[i]) do begin
bitblt (MyCanvas.Handle,X,Y,Bitmap.Width,Bitmap.Height,0,0,
Bitmap.Canvas.Handle,
SRCCOPY);
end;
// и на форму
bitblt(Canvas.Hanble,0,0,ClientWidth,ClientHeight,MyCanvas.Handle,0,0,SRCCOPY);

код отрисовки должен быть на OnPaint формы



разрушить List, а перед этим все битмапы и
MyCanvas.Free в конце проги


я правильно тебя понял?





 
neodiX   (2002-12-19 09:43) [5]

Vrode cto to pohoze (seicas net vozmonosti proverit"), no chut" ne to. Tut u tebia vnacale zapolniaetsia list, a potom iz nego vsio beriotsia ir risuetsia, u menia ze, prihodit po odnomu kadru(t.e. list ne nuzen, nu s etim razberiomsia) i ego(kadr) srazu nado risovat". Mozet u tebia to cto nado, no ja dumaju cto posle

> // и на форму
> bitblt(Canvas.Hanble,0,0,ClientWidth,ClientHeight,MyCanvas.Handle,0,0,SRCCOPY);

forma budet zarisovana i ftoroi kadr budet uze risovatsia na "isporcenoi forme". Xorosho by bylo kadry risovat" na odnoi kanve(ne vse srazu, a po odnomu, vrode u tebia tak i sdelano), a potom etu canvu risovat" na forme, ejo ne zarisovyvaja.


 
AlexT1000   (2002-12-19 12:17) [6]

вообщем ты как-нить на русском напиши в чем суть задачи. чем могу помогу.
не зная идею задачи трудн очто-то конкретно советовать


 
neodiX   (2002-12-19 12:40) [7]

Seicas ne mogu na russkom :( (poze napishu).
No ty i sam mozesh predstavit zadacu, prosto zadai vopros kak naprimer RAdmin ili VNC korrekto otobrazaet polucennye kadry s udolionnogo kompa u sebia na forme.


 
AlexT1000   (2002-12-19 12:46) [8]

RAdmin ili VNC не могу . потому как не знаю, что это ваще за птицы


 
neodiX   (2002-12-19 14:24) [9]

Esli ty v lokalke ili est" dva kompa, vozmi v inete xotia by RAdmin (ocen bystro naidiosh cerez google), u sebia zainstal" klienta, a na drugom kompe - server, i posmotry co za vesch. (kogda poprobuesh, ty ego (radmin) ne zahocesh uninstalit" :)).

P.S. esli net vozmonosti poprobyvat" :(, togda kogda budet vozmonost" objasniu problemu na russkom jazyke.


 
AlexT1000   (2002-12-19 17:13) [10]

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

b := Tbitmap.Create;
b.Width := Screen.Width;
b.Height := Screen.Height;
dc := GETDC(0);
bitblt(b.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
DC, 0, 0, SRCCOPY);
B.SaveToFile("screen.bmp");
ReleaseDC(0,DC);
B.Free;


 
neodiX   (2002-12-19 17:56) [11]

Ne u menia vsio cut" luche :). U menia dlia kopirovanija ekrana spec. alogoritm razrabotan v dll"ke. Ja polucaju ne tolko izobrazenie vsego okna (eto u menia pervyi kadr), ja polucaju daze malenkie izmenenija (naprimer kogda ty vodish myshkoi po menu, menu podsvechivaetsia, tak vot ja etu podsvetku t.e. kvadratik s tekstom "File" kopiruju v image i posylaju). Tak polucaetsia nagruzka na set" menshe i voobshe racionalnee. Tak vot teper ponimaesh kakoi u menia bardak posylaetsia :), a mne ego nado korrektno otobrazit. Konecno, esli ves" ekran posylat", to net problem, no menia takoi rasklad nikak ne ustraivaet, mne nuzna skorost".


 
AlexT1000   (2002-12-19 19:19) [12]

а может тебе получат ькаждый раз экран . запаковывать его в архив и пересылать. так легче и накрузка на сеть уменьшиться и тебе легче будет.
или ваще jpg делать и пересылать. максимальное сжатие


 
neodiX   (2002-12-20 09:32) [13]

Tak ja jpeg"i i posylaju. Esli posylat" ves ekran, to daze pri konvertirovanii ekrana v jpeg maximum polucaestsia 1 frame v secundu, proverial (kak ja govoril menia eto ne ustraivaet, mne nuzno bystree, pritom zachem posylat" ves ekrana kogda izmenilas" tolko malenkaja chast"). Pritom nagruzka na komp bolshaja, samo konvertirovanie (vsego ekrana) dovolno mnogo resursov zriot.


 
AlexT1000   (2002-12-20 11:56) [14]

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

на экране 2 окна .
сп 1
окно 1 0 0 800 600
окно 2 10 10 400 200

построили список с экрана . имеем

сп 1
окно 1 0 0 800 600 - осталось прежним
окно 2 20 20 410 210 - переместилось

сервер посылает клиенту команду

ПЕРЕРИСОВАТЬ координаты 10 10 400 20 фрейм данные этой части
экрана

ПЕРЕРИСОВАТЬ координаты 10 10 20 200 фрейм данные этой части
экрана

НАРИСОВАТЬ ОКНО 2 в координатах 20 20 410 210 - этот слепок тебе прислали заранее.

дальше развиваешь эту идею и все у тебя заработает .

если окно удалили то
получаешь фрейм с координатами где было окно

я думаю это будет самый оптимальный вариант



 
neodiX   (2002-12-20 14:29) [15]

OK, na vyhodnyh poprobuju etot variant. Esli cto, my prodolzim etot topic.

P.S. vidish, prosto ja nacinaja temu etogo dialoga nadejalsia cto est" sposob realizovat etu pererisovku na storone klienta, s pomoshju kakih nit" standartnyh metodov (tipa s ispolzovaniem vsiakih tam CreateCompatibeDC, SelectObject i t.d.). No kak ja ponial, k sozaleniju, eto nevozmozno (ili poka cto za slozno dlia menia). Nu cto ze, budem probyvat" alternativy.

Spasibo za cto vydelil kvant vremeni dlia reshenija moej zadaci.



 
AlexT1000   (2002-12-20 14:57) [16]

задача еще не решена.

незачто.


 
neodiX   (2002-12-23 11:21) [17]

Перед тем как делать хотел бы уточнить пару вещей...

> сервер посылает клиенту команду
>
> ПЕРЕРИСОВАТЬ координаты 10 10 400 20 фрейм данные этой
> части
> экрана
>
> ПЕРЕРИСОВАТЬ координаты 10 10 20 200 фрейм данные этой
> части
> экрана


перерисовать на что? т.е. перерисовать два куска с 0 0 800 600 фрейма? Но может быть такой вариант, что на "0 0 800 600" фрейме одно окно уже было нарисовано так, что наше новое окно с ним пересеклось (как бы часть его была нарисована на этом окне, т.е. окно было нарисовано И на главном "0 0 800 600" И на каком то еще окне) тогда после того как окно 2 переместилось мне что перерисовывать И часть главного "0 0 800 600" И часть того еше одного окна. Получается что мне надо запомнить это "еще одно" окно (притом, как ты понял, таких "еще одних" может быть туча). Может я ни так понял твою идею?


 
smok_er   (2002-12-23 18:03) [18]

Моя идея в следующем...
просто посылать не информацию об окнах, а о конкретных пикселах!
его координаты и цвет
на стороне клиента обрабатывать эту информацию и менять нужные пикселы!
так самый лучший вариант


 
neodiX   (2002-12-24 12:41) [19]

2> смок_ер

> просто посылать не информацию об окнах, а о конкретных пикселах!

это что ли посылать массив пикселев? да еще к каждому пикселю цвет - не думаю что выдет лучше.

> на стороне клиента обрабатывать эту информацию и менять
> нужные пикселы!

менять т.е. рисовывать? Хорошо, я получил масив пикселей в 30Кб, то что мне по одному пикселю выводит на канву? Не долго ли?

Подробней обьясни свою идею, может я не так понял.


 
Roger   (2002-12-24 17:46) [20]

Парни, вы пытаетесь заново изобрести формат видеосжатия типа MPEG4. Не стоит этого делать. Лучше забудь про все окна и объекты, работай с изображением!!! у тебя есть 2 изображения экрана в разные моменты времени. Надо только выяснить что изменилось, и если есть изменения, то отобразить их на клиентском экране. Естественно, когда изменений нет - нагрузка на сеть нулевая и перерисовывыть ничего не надо, а когда на сервере смотрят кино, то тут уж извините! :)))
Подумай над этим.


 
neodiX   (2002-12-29 15:47) [21]

2>Roger

> Надо только выяснить что изменилось, и если есть изменения,
> то отобразить их на клиентском экране

хорошо, сравнивая попиксельно два изображения, я нашел начальную координату несовпадения (предположим на первом изо. есть окно, а на втором это окно передвинулось), ну и что теперь? Мне же все равно надо до конца сравнивать что изменилось... Теперь будут не совпадать пиксели в диапозоне изо1 ОR изо2, так мне что весь этот диапозон и посылать?
Я уже долго над этим думаю, но ничего не могу придумать. Я то понимаю, что надо посылать только изменения но реализовать этого не могу. Если у кого есть хоть примеры - помогите plz.


 
neodiX   (2002-12-29 22:25) [22]

Ну вот попробывал попиксельно проверять что изменилось, и то что изменилось (эти пиксели) посылать. Так вот - это все тааак медлено работает, что хоть застрелись. Ну а так и должно быть.. весь десктоп в 1024х768 проверять попиксельно - это все же время и ресурсы компа. Если кто знает по какому принципу работает MPEG4 обьясните plz.


 
Roger   (2002-12-30 11:05) [23]

А нафига проверять попиксельно? Наложи на экран сетку и проверяй изменения в узлах, если узел изменился, то пересылай прилегающие площади. Если не хочешь пересылать все 4 квадрата, то вычисли в каком именно есть изменения.

> предположим на первом изо. есть окно, а на втором это окно
> передвинулось

КАКОЕ ОКНО???? А если я допустим раскрыл WORD во весь экран ипечатаю текст? какие координаты какого окна ты собираешся отслеживать???


 
Roger   (2002-12-30 11:52) [24]


> предположим на первом изо. есть окно, а на втором это окно
> передвинулось

КАКОЕ ОКНО??? А если я печатаю текст в полноэкранном WORDе? какие координаты какого окна ты собираешся вычислять?


> сравнивая попиксельно два изображения, я нашел начальную
> координату несовпадения

Можно вопрос - ЗАЧЕМ ПОПИКСЕЛЬНО????? Даю идею - наложи на изображение сетку, частоту подбери сам, и проверяй изменения в узлах и если есть изменение, то перерисовываешь прилегающие к узлу квадраты.
Повторяю это только идея, реализацию можно усложнить.



 
Roger   (2002-12-30 11:55) [25]

Повторение получилось из за плохой связи, постоянно рвётся! :(((


 
neodiX   (2002-12-30 12:40) [26]

2>Roger
> наложи на изображение сетку, частоту подбери сам, и проверяй
> изменения в узлах и если есть изменение, то перерисовываешь...

а как по твоему проверяются изменения в узлах? Хорошо бы было если так
if nodeBmp1=nodeBmp2 then ...
так нет, надо по пиксельно проверять. A может ты знаешь как быстрее?


 
Roger   (2002-12-30 13:12) [27]

Ну и что что попиксельно, так узлов то при шаге 100x50 получится всего около 1500, а это даже для 200го пня не проблема.


 
neodiX   (2002-12-30 13:21) [28]

т.е. как я понял алгоритм такой:
проверяю попиксельно первый узел, если хоть один пиксел не совпадает сразу же этот узел посылаю и перехожу проверять следующий и т.д.. Правильно?


 
Roger   (2002-12-30 14:24) [29]


> если хоть один пиксел не совпадает

Узел, это и есть ПИКСЕЛ, и если он именился, то посылаешь примегающие к нему квадраты. Ну вспомни школьную тетрадку в клетку, узел это пересечение линий, а квадраты, это клетки.


 
Roger   (2002-12-30 14:26) [30]


> примегающие к нему квадраты

Я имел в виду прилегающие.


 
neodiX   (2003-01-02 18:03) [31]

Да, вот это идея! Правильно говорят: "Что просто, то гениально!". Огромное спасибо!


 
Roger   (2003-01-04 10:21) [32]

Я тут подумал, можно ещё упростить. проверять изменения в центре квадрата (один пиксел), и если есть изменения, то передавать один этот квадрат.

> "Что просто, то гениально!". Огромное спасибо!

Идея бесплатная, так что обращайся. В самом программировании, может я и не очень спец, но насчёт идей - сколько угодно!
(Как то не скромно получилось, ну да ладно):)))



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.009 c
4-19931
Donatas
2003-02-07 11:39
2003.04.07
mesages


4-19915
aga
2003-02-02 16:45
2003.04.07
Update


1-19649
Мыш
2003-03-25 10:44
2003.04.07
рисование


1-19553
Fast
2003-03-27 02:14
2003.04.07
FormCreate


1-19640
zaratustra
2003-03-25 15:18
2003.04.07
Печать в текстовом режиме в Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский