Передача изображения по сети
От: CastleMaster  
Дата: 25.07.08 04:36
Оценка:
Делаю десктоп приложение для передачи изображения с удаленных компьютером на консоль администратора —
упрощенная версия Remote Administrator-a.

Данные передаются по локальной сети через .NET Remoting (TCP IP канал).

В сделанном прототипе не устраивает скорость работы. Сделал 2 версии:

1. Пересылаю весь экран как png файл (массив байтов) — но тормозит (если обновлять 5 раз в секунду) — забивается канал передачи (тестировал на Virtual PC — эмулируется 10мбит сеть).

2. Разбивал экран на 3x3 или 4x4 квадрата — и пересылал только изменившиеся квадраты — в данном случае тормозит отрисовка на админ клиенте — т.к. используется чистый .NET — Image->Graphics->PictureBox control->Windows Forms — и отобразить нескольоко image вместо одного занимает гораздо больге времени.

Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.
screen remote desktop
Re: Передача изображения по сети
От: Аноним  
Дата: 25.07.08 06:48
Оценка: +1
Здравствуйте, CastleMaster, Вы писали:

CM>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.


как вариант, передавать картинку с меньшим масштабом. коэффициент масштабирования подобрать опытным путем такой, чтобы не было сильных искажений при восстановлении масштаба на клиенте. или в протоколе ввести команду, которая будет говорить серверу, с каким масштабом и с какой частотой передавать картинку.
также разработать следующий алгоритм:
1. в первое время передать картинку полностью.
2. все остальное время передавать только измененные пикселы на картинке.
3. клиент по измененным пикселам будет у себя картинку восстанавливать.
Re: Передача изображения по сети
От: TATAPuH США  
Дата: 29.07.08 11:05
Оценка: 2 (1)
Здравствуйте, CastleMaster, Вы писали:

CM>2. Разбивал экран на 3x3 или 4x4 квадрата — и пересылал только изменившиеся квадраты — в данном случае тормозит отрисовка на админ клиенте — т.к. используется чистый .NET — Image->Graphics->PictureBox control->Windows Forms — и отобразить нескольоко image вместо одного занимает гораздо больге времени.


CM>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.


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

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

а вообще странная задача — изобретать рАдимина

Иван
Re: Передача изображения по сети
От: SpLove Россия  
Дата: 29.07.08 11:18
Оценка:
Здравствуйте, CastleMaster, Вы писали:

CM>Делаю десктоп приложение для передачи изображения с удаленных компьютером на консоль администратора —

CM>упрощенная версия Remote Administrator-a.

CM>Данные передаются по локальной сети через .NET Remoting (TCP IP канал).


CM>В сделанном прототипе не устраивает скорость работы. Сделал 2 версии:


CM>1. Пересылаю весь экран как png файл (массив байтов) — но тормозит (если обновлять 5 раз в секунду) — забивается канал передачи (тестировал на Virtual PC — эмулируется 10мбит сеть).


CM>2. Разбивал экран на 3x3 или 4x4 квадрата — и пересылал только изменившиеся квадраты — в данном случае тормозит отрисовка на админ клиенте — т.к. используется чистый .NET — Image->Graphics->PictureBox control->Windows Forms — и отобразить нескольоко image вместо одного занимает гораздо больге времени.


CM>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.

Как вариант картинки не плохо сжимаются архиватором.
Re[2]: Передача изображения по сети
От: Аноним  
Дата: 29.07.08 14:54
Оценка:
Здравствуйте, SpLove, Вы писали:

CM>>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.

SL> Как вариант картинки не плохо сжимаются архиватором.

попробуйте сжать jpeg.
Re[3]: Передача изображения по сети
От: Аноним  
Дата: 30.07.08 11:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, SpLove, Вы писали:


CM>>>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.

SL>> Как вариант картинки не плохо сжимаются архиватором.

А>попробуйте сжать jpeg.

Попробуйте сжать bmp
Re[4]: Передача изображения по сети
От: Аноним  
Дата: 30.07.08 11:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, SpLove, Вы писали:


CM>>>>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.

SL>>> Как вариант картинки не плохо сжимаются архиватором.

А>>попробуйте сжать jpeg.

А>Попробуйте сжать bmp
Какие все умные. Речь идет он неплохо сжимается.
Re: Передача изображения по сети
От: Pavel M. Россия  
Дата: 30.07.08 22:58
Оценка: 2 (1)
Здравствуйте, CastleMaster, Вы писали:

CM>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.


Я делал просто. Во-первых нужно получить целевой размер отрисуемой области принимающего приложения, если она меньше скриншота (что вероятнее всего) уменьшаем скриншот до ее границ, далее жмем jpg с нужным коэффициентом качества. Этого должно хватить, картинка получается маленькая по объему и с небольшим количеством искажений (особенно в динамике это будет слабо влиять).
--------------------------
less think — do more
Re[2]: Передача изображения по сети
От: CastleMaster  
Дата: 31.07.08 00:17
Оценка:
Здравствуйте, TATAPuH, Вы писали:

TAT>Здравствуйте, CastleMaster, Вы писали:


CM>>2. Разбивал экран на 3x3 или 4x4 квадрата — и пересылал только изменившиеся квадраты — в данном случае тормозит отрисовка на админ клиенте — т.к. используется чистый .NET — Image->Graphics->PictureBox control->Windows Forms — и отобразить нескольоко image вместо одного занимает гораздо больге времени.


CM>>Посоветуйте способы улучшения скорости работы — как алгоритмические так и технические.


TAT>привельнее наверно хранить одну большую картинку (кеш) на клиента админа

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

TAT>и уже вот эту большую картинку блитать на форму (контрол для отображения)

а как блитануть картинку сразу на graphics формы, не использую PictureBox.
Как то поменять OnPaint?

TAT>скорость должна сильно улучшится


TAT>ещё варианты, админу постоянно нужен полноцветная картинка ? если нет то можно на клиенте перед отправкой её грейскейлить, обьём передоваемых данных станет заметно меньше.

подскажи как в .NET картинку grayscale. Насколько это будет медленно?

TAT>Иван

Спасибо.
Re[2]: Передача изображения по сети
От: CastleMaster  
Дата: 31.07.08 00:21
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Я делал просто. Во-первых нужно получить целевой размер отрисуемой области принимающего приложения, если она меньше скриншота (что вероятнее всего) уменьшаем скриншот до ее границ, далее жмем jpg с нужным коэффициентом качества. Этого должно хватить, картинка получается маленькая по объему и с небольшим количеством искажений (особенно в динамике это будет слабо влиять).


я пока остановился на png — получается быстрее чем jpg (я использую только стандартные .NET классы) и размер гораздо меньше чем raw bmp. Хотелось бы научиться как сжимать 32 битовый bmp скриншот в 256 цветный png Пока приходится пересылать 16 битный png что для моего случая просто излишняя растрата ресурсов.
Re[3]: Передача изображения по сети
От: TATAPuH США  
Дата: 31.07.08 05:41
Оценка:
Здравствуйте, CastleMaster, Вы писали:

TAT>>ещё варианты, админу постоянно нужен полноцветная картинка ? если нет то можно на клиенте перед отправкой её грейскейлить, обьём передоваемых данных станет заметно меньше.

CM>подскажи как в .NET картинку grayscale. Насколько это будет медленно?

вообще говоря гугл и МСДН рулит

public static Bitmap ToGrayscale(Bitmap original)
{
   //create a blank bitmap the same size as original
   Bitmap newBitmap =
      new Bitmap(original.Width, original.Height);
   
   //get a graphics object from the new image
   Graphics g = Graphics.FromImage(newBitmap);

   //create the grayscale ColorMatrix
   ColorMatrix colorMatrix = new ColorMatrix(
      new float[][]
      {
         new float[] {.3f, .3f, .3f, 0, 0},
         new float[] {.59f, .59f, .59f, 0, 0},
         new float[] {.11f, .11f, .11f, 0, 0},
         new float[] {0, 0, 0, 1, 0},
         new float[] {0, 0, 0, 0, 1}
      });

   //create some image attributes
   ImageAttributes attributes = new ImageAttributes();

   //set the color matrix attribute
   attributes.SetColorMatrix(colorMatrix);

   //draw the original image on the new image
   //using the grayscale color matrix
   g.DrawImage(original,
      new Rectangle(0, 0, original.Width, original.Height),
      0, 0, original.Width, original.Height,
      GraphicsUnit.Pixel, attributes);

   //dispose the Graphics object
   g.Dispose();
   return newBitmap;
}


взято отсюда
http://blog.paranoidferret.com/index.php/2007/08/31/csharp-tutorial-convert-a-color-image-to-greyscale/
Re[3]: Передача изображения по сети
От: TATAPuH США  
Дата: 31.07.08 05:57
Оценка:
Здравствуйте, CastleMaster, Вы писали:

CM>как я делал — делал скриншот всего экрана и копался в битах чтобы выделить

CM>изменившийся прямоугольник. Потом приходилось переснимать скриншот изменившийся
CM>части — и пересылать его — мне кажется два скриншота подрят будут подтормаживать систему.

во первых вопрос
у меня почемуто такое ощущение, что клиентом отсылающим скриншот являтеся само приложение ? тоесть оно как бы само себя скриншотит и отсылает админской части ?
если да то маленький совет

в главной форме отслеживайте все виндовые сообщения через
protected override void WndProc(ref Message m)

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

в итоге вы можете пропустив сообщение через фильтр который решит что данное сообщение возникло после перерисовки дочернего элемента
вычислить по хендлу элемента его размер и позицию на экране
"отскриншотить" только заданную область
и именно её отправить админу

я подозреваю что большая часть времени у вас как раз сьедается на попиксельное сравнение и вычисление изменившейся секции

(при описанном выше подходе скорее всего возникнут проблемы с меню и контекстным меню)

впрочем вам стоит копать в сторону хуков
смотрите на класс System.Windows.Forms.NativeWindow
в мсдн есть примеры

фактически вам надо просто перехватить WM_PAINT и ещё парочку сообщений для всех hwnd винды
позволить системе отработать сообщение
и в случае если обьект вам интересен — принадлежит вашей апликации
получить баундинг отрисовавшевося обьекта — и отправить его админу

а уж сжатие картинки или её грейскейл это всеголиш косметика

и учтите, не все форматы "одинаково полезны" — хорошо жмутся
Re[2]: Передача изображения по сети
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.07.08 10:32
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Я делал просто. Во-первых нужно получить целевой размер отрисуемой области принимающего приложения, если она меньше скриншота (что вероятнее всего) уменьшаем скриншот до ее границ, далее жмем jpg с нужным коэффициентом качества.


png скриншоты как правило жмет сильнее jpeg, быстрее и без потерь качества.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[3]: Передача изображения по сети
От: Pavel M. Россия  
Дата: 31.07.08 10:51
Оценка: -1
Здравствуйте, CastleMaster, Вы писали:

CM>Здравствуйте, Pavel M., Вы писали:


CM>я пока остановился на png — получается быстрее чем jpg (я использую только стандартные .NET классы) и размер гораздо меньше чем raw bmp. Хотелось бы научиться как сжимать 32 битовый bmp скриншот в 256 цветный png Пока приходится пересылать 16 битный png что для моего случая просто излишняя растрата ресурсов.


Думаю, нужно просто правильно декодер настроить. Это раз. Во-вторых, png сделан для изображений небольшого размера, попробуйте сравнить с jpg. ))
--------------------------
less think — do more
Re: Передача изображения по сети
От: vdimas Россия  
Дата: 31.07.08 11:39
Оценка:
Здравствуйте, CastleMaster, Вы писали:

Мы сделали передачу областей 16х16 пикселей. Передаются только изменённые области, общий поток жмется, все работает нормально. Если изображение поменялось "кардинально", то передаётся вся картинка в PNG.

Что использовать для отображения давал здесь: http://rsdn.ru/Forum/message/2708232.1.aspx
Автор: vdimas
Дата: 26.10.07

Используется in-memory массив пикселей, который синхронизирует изменённые участки с битмапом. Можно менять размер, можно рисовать на нём обычным способом.

Вот отрисовка в контроле, который использует этот in-memory хелпер:

        public class RemoteWindow : Control
        {
            readonly MemoryImage _image = new MemoryImage(0, 0);
            
            public RemoteWindow() {
                SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
                SetStyle(ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, false);
            }
            
            private void PaintWindow(Graphics g, Rectangle rc)
            {
                Rectangle imgrc = new Rectangle(Point.Empty, _image.Size);
                g.DrawImage(_image.Bitmap, imgrc, imgrc, GraphicsUnit.Pixel);
            }
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: Передача изображения по сети
От: CastleMaster  
Дата: 02.08.08 13:37
Оценка:
Здравствуйте, TATAPuH, Вы писали:

CM>>части — и пересылать его — мне кажется два скриншота подрят будут подтормаживать систему.


TAT>во первых вопрос

TAT>у меня почемуто такое ощущение, что клиентом отсылающим скриншот являтеся само приложение ? тоесть оно как бы само себя скриншотит и отсылает админской части ?
TAT>если да то маленький совет
Нет, — пересылается весь экран. По сути пишу упрощенную версию Remote Admin.

TAT>я подозреваю что большая часть времени у вас как раз сьедается на попиксельное сравнение и вычисление изменившейся секции


В точку — поэтому и хочу избежать.

TAT>впрочем вам стоит копать в сторону хуков

TAT>смотрите на класс System.Windows.Forms.NativeWindow
TAT>в мсдн есть примеры

С хуками возиться уже не хочется — в свое время много от них натерпелся, ну и проблема с трафиком обмена, можно сказать, решена.

TAT>фактически вам надо просто перехватить WM_PAINT и ещё парочку сообщений для всех hwnd винды

TAT>позволить системе отработать сообщение
TAT>и в случае если обьект вам интересен — принадлежит вашей апликации
TAT>получить баундинг отрисовавшевося обьекта — и отправить его админу

Со грабингом изображения обнаружилась заковырка — не грабятся hints (всплывающие подсказки) и полупрозрачные изображения иконок при их перетаскивании по десктопу. Поиск показывает что это может быть связано что они выводятся на DirectX Surface — только что-то не верится. Есть ли способ сграбить hints — если даже их PrintScreen?! не захватывает?
Re: Передача изображения по сети
От: madbinom  
Дата: 02.08.08 16:40
Оценка:
1. Разбить на кучу кусочков небольшого размера (подберите сами в процессе).
2. Передавать только измененные кусочки, а сравнение на изменненость осуществляется как в пункте 3
3. Кусочек жмется (руками), и при проходе считается хэш (неважно какую использовать, можно просто сумму контрольную считать, а можно некое значение использовать, меняемое в прогоне алгоритма сжатия.
В зависимости от алгоритма сжатия, можно тупо взять, например, 4 байта в сжатом результате, начиная с 5-го. Вероятность коллизии будет очень мала.
Re[3]: Передача изображения по сети
От: WolfHound  
Дата: 02.08.08 20:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>попробуйте сжать jpeg.

http://www.maximumcompression.com/data/jpg.php
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Передача изображения по сети
От: Pavel M. Россия  
Дата: 02.08.08 20:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>png скриншоты как правило жмет сильнее jpeg, быстрее и без потерь качества.


Не совсем объективный, но все -таки тест. Один и тот же скриншот моего рабочего стола в mspaint сохранен в

jpg — 192 kb
png — 1 683 kb

И кому нужно looseless?)))
--------------------------
less think — do more
Re[4]: Передача изображения по сети
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 03.08.08 14:23
Оценка: +1
Здравствуйте, Pavel M., Вы писали:

PM>Не совсем объективный, но все -таки тест. Один и тот же скриншот моего рабочего стола в mspaint сохранен в


PM>jpg — 192 kb

PM>png — 1 683 kb

Во-первых неизвестно как сохраняет mspaint, во-вторых, надо думать, на твоем рабочем столе лежит большая и красивая фотография?
... << RSDN@Home 1.2.0 alpha 4 rev. 1099 on Windows Vista 6.0.6001.65536>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.