Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2010, 16:16
strbb strbb вне форума
Прохожий
 
Регистрация: 20.12.2010
Сообщения: 14
Репутация: 10
По умолчанию аналог радмина, сжатие скрина

Пишу аналог радмина по локальной сети, необходимо быстро сжать скриншот до 1.5 - 2 метров (как минимум), jpg, gif, png не подходят, слишком долго сжимают ... Есть ли форматы для быстрого сжатия изображения?
Ответить с цитированием
  #2  
Старый 20.12.2010, 16:22
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,564
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от strbb
Пишу аналог радмина по локальной сети, необходимо быстро сжать скриншот до 1.5 - 2 метров (как минимум), jpg, gif, png не подходят, слишком долго сжимают ... Есть ли форматы для быстрого сжатия изображения?
Тут нужен другой подход - отлавливать изменения происходящие на удаленом экране и передавать только их (уже экономи траффика), а сжатие использовать например ZLib.
Ответить с цитированием
  #3  
Старый 20.12.2010, 16:27
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

до 2х метров?!
у меня скриншот экрана в жпеге весит 150кб, а сжимается очень быстро:
Код:
dc:=GetDC(0):
bitblt(bm.canvas.handle,0,0,w,h,dc,0,0,SRCCOPY);
JP.Assign(bm);

Я же когда делал свою простенькую прогу удаленного просмотра рабочего стола с доп. функциями чтобы не грузить сеть (при низкой скорости соединения) кидал квадрат вокруг мыши 300х300.
для справки: 800*600*3 = 1.5 метра. в БМП формате. Если сеть поддерживает, можно поступить так же.

Или же разбираться с форматами видео, где кодируются только изменения.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 20.12.2010, 16:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Admin
Тут нужен другой подход - отлавливать изменения происходящие на удаленом экране и передавать только их (уже экономи траффика), а сжатие использовать например ZLib.
+еще отключить все эффекты
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 20.12.2010, 16:44
strbb strbb вне форума
Прохожий
 
Регистрация: 20.12.2010
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
до 2х метров?!
у меня скриншот экрана в жпеге весит 150кб, а сжимается очень быстро:
Код:
dc:=GetDC(0):
bitblt(bm.canvas.handle,0,0,w,h,dc,0,0,SRCCOPY);
JP.Assign(bm);

Я же когда делал свою простенькую прогу удаленного просмотра рабочего стола с доп. функциями чтобы не грузить сеть (при низкой скорости соединения) кидал квадрат вокруг мыши 300х300.
для справки: 800*600*3 = 1.5 метра. в БМП формате. Если сеть поддерживает, можно поступить так же.

Или же разбираться с форматами видео, где кодируются только изменения.

При разрешении 1080х960 скрин сжимается за 200мсек, т.е. при наилучшем раскладе можно добиться фпс 5.
Насчет квадрата, интересно, но если я открою окно? Или разверну? Надо обновить весь экран, а не 300х300, либо каждые 3-4 сек слать фулл скрин.
Ответить с цитированием
  #6  
Старый 20.12.2010, 16:45
strbb strbb вне форума
Прохожий
 
Регистрация: 20.12.2010
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
+еще отключить все эффекты
Можно по подробнее? Только что юзнул ZLib, скорость сжатия оставляет желать лучшего, jpg сжимает в разы быстрее.
Ответить с цитированием
  #7  
Старый 20.12.2010, 20:14
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

насчет квадрата - я транслировал просто квадрат вокруг мышки. Типа обновляется то, где мышь. Если открылось окно - то надо помахать курсором по экрану чтоб все обновить Не слишком удобно, но все же лучше чем ничего.

Лучше всего отлавливать на экране изменения, как и сказал Admin. Сжимать можно во все, что угодно, но если слать небольшие куски экрана где были изменения, то думаю ЖПГ будет не самым эффективным.
Более того, компьютерные скрины в ЖПГ вообще сжимаются не лучшим образом.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 20.12.2010, 21:43
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,564
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Джпег идет с потерей качества.
А так берешь свой маленькой изменненный кусок экрана в виде BMP, сжимаешь Zlib и пересылаешь, и так все изменения.
Вот простой пример, в виде бинарников: Remote Test.
Ответить с цитированием
  #9  
Старый 20.12.2010, 23:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Вспомнил свою старую прогу, решил переделать ее
Посоветуйте пожалуйста: как лучше всего фиксировать изменения полосы экрана? А то скорость сравнения всех пикселей через ScanLine в TBitMap меня не удовлетворила...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 21.12.2010, 09:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Bargest
как лучше всего фиксировать изменения полосы экрана?
классический вариант 3 ловушки: WH_CALLWNDPROC, WH_GETMESSAGE, WH_SYSMSGFILTER и отлавливать сообщения: WM_HSCROLL, WM_VSCROLL, WM_NCACTIVATE, WM_NCPAINT, WM_ERASEBKGND и т.д. ну и конечно WM_PAINT.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 21.12.2010, 16:24
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Но ведь в таком случае если открыто одно окно на весь экран, то будет перекидываться весь экран, даже если в реале ничего или почти ничего не изменилось...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #12  
Старый 21.12.2010, 16:36
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну естественно, если окно видеоплеера распахнуто, то придется передавать весь экран. а так GetUpdateRgn в WM_PAINT скажет какой прямоугольник экрана изменился и каую область экрана нужно передать. например при перемещении окна по экрану будут передаваться только те области, которые появляются из под перемещаемого окна (WM_ERASEBKGND). при нажатии на кнопку только прямоугольник занимаемый кнопкой. при печати текста в поле ввода только прямоугольник поля ввода (WM_SETTEXT) и т.д. и т.п.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 21.12.2010 в 16:41.
Ответить с цитированием
  #13  
Старый 21.12.2010, 16:46
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Благодарю
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #14  
Старый 22.12.2010, 14:22
strbb strbb вне форума
Прохожий
 
Регистрация: 20.12.2010
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
ну естественно, если окно видеоплеера распахнуто, то придется передавать весь экран. а так GetUpdateRgn в WM_PAINT скажет какой прямоугольник экрана изменился и каую область экрана нужно передать. например при перемещении окна по экрану будут передаваться только те области, которые появляются из под перемещаемого окна (WM_ERASEBKGND). при нажатии на кнопку только прямоугольник занимаемый кнопкой. при печати текста в поле ввода только прямоугольник поля ввода (WM_SETTEXT) и т.д. и т.п.

Никогда не работал с win api, поэтому задам глупый вопрос)
С помощью GetUpdateRgn получаю результат в hrng, как его сохранить в bitmap? Гугл не помог ...
Ответить с цитированием
  #15  
Старый 22.12.2010, 15:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

через GetUpdateRgn получаем хэндл региона для обновления, потом вызываем GetRegionData и получаем прямоугольник, далее копируем этот прямоугольник BitBlt. ну это так, в кратце)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter