Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/24: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
1

Как передать скриншот (принтскрин) по TCP ?

25.06.2013, 16:38. Просмотров 4702. Ответов 45
Метки нет (Все метки)

Всем привет!
Интересует 2 вещи:
  • Как сделать снимок экрана НЕ используя буфер обмена.
  • И результат передать по протоколу TCP ?
Сам процесс передачи не очень важен, главное это как сделанный снимок перевести в строку и потом при получении строки получить из неё картинку обратно!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 16:38
Ответы с готовыми решениями:

Как сделать скриншот и передать его?
Уважаемые форумчане, искал подобную тему, но так и не нашёл темы, в которой будет подробный ответ...

Socket TCP на C++. Как передать данные в формате JSON
Доброго времени суток товарищи программисты. Подскажите пожалуйста! Есть написан на C++ TCP...

Как сделать принтскрин из программы??
Как сделать принтскрин из программы?? Чтобы потом его можно было из буфера вставить в Image? Может...

Передать по TCP
Я хочу передать с клиента TCP андроид на Qt TCP сервер изображение, байты звука, размеры и хочу это...

Передать int по TCP
Я хочу передать через сокеты TCP размер изображения а затем само изображение. Как правильно...

45
Pro_grammer
Модератор
6253 / 2344 / 455
Регистрация: 24.04.2011
Сообщений: 4,185
Записей в блоге: 10
25.06.2013, 18:58 2
Цитата Сообщение от Bati4eli Посмотреть сообщение
Как сделать снимок экрана НЕ используя буфер обмена.
При помощи API BitBlt
Цитата Сообщение от Bati4eli Посмотреть сообщение
как сделанный снимок перевести в строку
Ни как - в файле изображения обычно есть 0, что воспримется как конец строки и соответственно потеря дальнейших данных. Передавать в бинарном виде.
алгоритм передачи-приема
1. Клиент-сервеный вариант подразумевает, что клиент - только передает, сервер - только принимает.
Для двухсторонней реализации, необходимо, запускать на каждом ПК и клиент и сервер.

2. Клиентский скрипт считывает содержимое файла, разбивает его на блоки по N-символов/байт, передает серверу:
* посылает команду, что начинается передача файла, название файла, размер файла
* получает ответ готовности приема
* отправляет 1-ый блок данных
* ожидает ответ о приеме
* получает ответ готовности
* отправляет 2-ой блок данных
* ожидает ответ о приеме
* получает ответ готовности
...
* отправляет поледний блок данных
* ожидает ответ о приеме
* получает ответ готовности
* отправляет команду завершения передачи файла

3. В этот момент у сервера уже есть все отправленные блоки файла, которые он сохраняет в хронологическом порядки в файл.
Для верности еще правильно было бы проверять размер итогового файла на совпадение с данными о файле полученными от клиента.
0
SoftIce
es geht mir gut
11188 / 4608 / 1160
Регистрация: 27.07.2011
Сообщений: 11,308
Завершенные тесты: 1
25.06.2013, 19:31 3
Цитата Сообщение от Bati4eli Посмотреть сообщение
Как сделать снимок экрана НЕ используя буфер обмена.
Прикреплённый пример подойдёт только для того, чтобы сделать снимок экрана.

Все остальные существующие в проекте преобразования крайне неэффективны(слишком долго выполняются), не рекомендую их использовать.
Хотя если требуется сделать снимок небольшой части экрана, то можно попробовать.
2
Миниатюры
Как передать скриншот (принтскрин) по TCP ?  
Вложения
Тип файла: rar PrintScreen.rar (2.3 Кб, 33 просмотров)
dev.Free
Заблокирован
25.06.2013, 21:26 4
Вирусы пишем.
0
25.06.2013, 21:26
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
25.06.2013, 22:17  [ТС] 5
@SoftIce,
а могли бы привести пользовательский тип DEVMODE ?
@Pro_grammer,
сам алгоритм передачи файла у меня наработан, и кстати при использовании TCP у меня скорость передачи файлов не привышает 100кб/с поэтому нужно как-то исключать такой принцип передачи как :
передал- получил ответ - передал..
0
SoftIce
es geht mir gut
11188 / 4608 / 1160
Регистрация: 27.07.2011
Сообщений: 11,308
Завершенные тесты: 1
25.06.2013, 22:20 6
Цитата Сообщение от Bati4eli Посмотреть сообщение
а могли бы привести пользовательский тип DEVMODE ?
Та ведь он в модуле есть
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Type DEVMODE
dmDeviceName As String * 32
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * 32
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
0
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
25.06.2013, 22:35  [ТС] 7
@SoftIce, да действительно очень долго выполняется.
Но в любом случае спасибо за пример. Наверно даже быстрее сохранить изображение в файл и передать уже его..

Добавлено через 2 минуты
@inv.DS, ну почему сразу вирусы? =)
Просто расширяю свой кругозор. В основном сейчас пишу разные сетевые программки. Еще не пробовал передачу изображения с вебки и передачу звука с микрофона.
0
dev.Free
Заблокирован
25.06.2013, 23:20 8
Цитата Сообщение от Bati4eli Посмотреть сообщение
с вебки и передачу звука с микрофона.
уже обсуждалось.

 Комментарий модератора 
тогда приводите линк.
0
dev.Free
Заблокирован
26.06.2013, 07:20 9
Цитата Сообщение от Dragokas Посмотреть сообщение
тогда приводите линк.
Нет проблем. Выложу файл

 Комментарий модератора 
Правила форума, пункт 1.4
Официальными языками форума являются русский и английский языки.

Предупреждение
1
Вложения
Тип файла: rar WebCam.rar (11.2 Кб, 34 просмотров)
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
01.07.2013, 11:37  [ТС] 10
inv.DS,
Может с принтскрином есть тоже что-нибудь в таком духе ??
Чет всё что угодно перепробовал, либо с экрана очень долго забирается инфа о цветах пикселей, либо наоборот тормоза при передаче и отображении пикселей ..
Короче как получить принтскрин не используя буфер я понял.. а вот как перекинуть через TCP изображение на другой комп и оперативно отобразить - никак не врублюсь.
0
dev.Free
Заблокирован
01.07.2013, 12:49 11
Bati4eli, А не проще сделать программу сервер и программу клиент и на сервере при отправке команды нажать клавишу принтскрин программно ?
0
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
01.07.2013, 17:38  [ТС] 12
inv.DS,
то ли я дурак, то ли лыжи не едут..
У меня таких недопрограмм куча.. вы хотите сказать, что нужно скопировать экран в буфер и потом тупо передать его таким образом:
Visual Basic
1
Winscok1.SendData Clipboard.Getdata
?
Но хоть убейте меня.. но не пашет такой метод у меня.
0
dev.Free
Заблокирован
01.07.2013, 18:34 13
Bati4eli, Антивирусы, файрволы, а что если сохранить файл и его потом переслать?
0
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
02.07.2013, 09:18  [ТС] 14
inv.DS, для разовой передачи подойдет.. а вот для постоянной передачи этот принцип так себе, потому что скриншот в формате bmp весит порядка 5 мб. Следовательно что-бы показывать хотябы один кадр в секунду, потребуется скорость соединения не менее 40мбит/с
0
dev.Free
Заблокирован
02.07.2013, 09:26 15
Bati4eli, Сохрани в .JPG какие проблемы то!?
0
Pro_grammer
Модератор
6253 / 2344 / 455
Регистрация: 24.04.2011
Сообщений: 4,185
Записей в блоге: 10
02.07.2013, 11:26 16
Цитата Сообщение от Bati4eli Посмотреть сообщение
для постоянной передачи
Для этого есть методика ключевых кадров
- Делим экран на квадраты ( или снимаем скрин по квадратам или делим скрин после)
- Каждый следующий скрин сравниваем с предыдущим
- Если на экране в какой то части изменения, то передаём на принимающий комп только те квадраты, которые изменились
- Перед передачей информацию упаковываем( или сжимаем JPG, PNG)
- На принимающем компе в изображение вставляем только эти квадраты, не изменяя остального изображения.

Этот метод позволяет существенно снизить нагрузку на трафик, но увеличивает на процессор. Сравнение изображений и их сжатие займет определенное время. Метод подходит идеально для ЯП, которые могут работать в многопоточном режиме - т.е пока часть квадратов сравнивается, сравненные уже передаются, а новые квадраты скриншотятся. На VB6 всё придется делать последовательно. Но если изображение на экране будет сменятся не очень быстро, то думаю VB6 справится.
2
Bati4eli
615 / 15 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
02.07.2013, 11:37  [ТС] 17
inv.DS, находил в инете классы для сохранения в JPG, да они сохраняют скрины в файлы весом 600-800 кбайт, но поскольку они занимаются сжатием, этот процесс становиться не быстрее передачи BMP..

Добавлено через 7 минут
Pro_grammer,
Я тоже думаю что нужно разбивать скрин на куски и сравнивать их .. но в таком случае нужно использовать функции GetPixel и SetPixel, я их пробовал но что-то их скорость меня не вдохновила на дальнейшее их использование.
Может есть какие наброски на практике ?
0
The trick
Модератор
8099 / 2815 / 776
Регистрация: 22.02.2013
Сообщений: 3,953
Записей в блоге: 77
02.07.2013, 12:20 18
Цитата Сообщение от Bati4eli Посмотреть сообщение
в таком случае нужно использовать функции GetPixel и SetPixel
Это зло! Используй GetDIBits, очень быстро получишь значения всех пикселей. Если смогу выложу пример. Я думаю для непрерывной передачи (что можно сказать является видео) можно рыть в сторону потокового видео. Всю работу по сравниванию блоков возьмет на себя кодек.
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
02.07.2013, 12:55 19
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Если есть доступ к данным объекта в памяти, то можно сделать проще. Скопировать область изображения куда-то и вычислить её CRC32, к примеру. То же проделать со сравниваемым участком, потом сравнить их CRC32, если совпадают, то скорее всего изображения одинаковые, если нет, то разные. Можно использовать и другие алгоритмы.

Я такой способ использовал в более простом случае, могу дать простую функцию для вычисления CRC8:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' *********************************
' *  ФУНКЦИИ ДЛЯ РАБОТЫ С ПАМЯТЬЮ
' *  ~~~~~~~~ ~~~~~~~~~ ~ ~~~~~~~
' *********************************
 
Public Declare Sub CopyMemory _
               Lib "kernel32.dll" _
               Alias "RtlMoveMemory" (ByRef Destination As Any, _
                                      ByRef Source As Any, _
                                      ByVal length As Long)
 
' Для памяти: как сделать на бейсике циклический сдвиг влево на 1 разряд
' Dim crc As Integer
' crc = 2 * crc
' crc = ((crc And &H100) / &H100) Or (crc And &HFE)
Public Function CalculateCRC8(ByVal Offset As Long, ByVal Size As Long) As Byte
    
    Dim b As Byte
    Dim CRC As Integer
    Dim I As Long
 
    CRC = &HFF
 
    Do While Size > 0
    
        Size = Size - 1
 
        CopyMemory b, ByVal DataPointer + Offset, 1
        
        Offset = Offset + 1
 
        CRC = CRC Xor b
 
        For I = 0 To 7
 
            If CRC And &H80 Then
            
                CRC = (2 * CRC) And &HFF
                CRC = CRC Xor &H31
                
            Else
            
                CRC = (2 * CRC) And &HFF
                
            End If
            
        Next
        
    Loop
 
    CalculateCRC8 = CByte(CRC)
    
End Function
DataPointer - это указатель на область памяти, относительно которого даётся смещение Offset. Нужно использовать какую-либо такую же функцию, либо найти в дебрях Win32API аналог (наверняка есть). При прямой работе с памятью скорость сравнения на порядки увеличится.

Добавлено через 18 минут
Не понял как тут редактировать сообщение... хотел добавить по поводу сжатия в JPEG. Это можно сделать при помощи функций GDI+. J, обёртку можно найти тут: [VB6] GDI+ Usage & Samples.

Добавлено через 7 минут
Да, кстати, сжимать кадры jpeg'ом смысла нет, т.к. при восстановлении картинки будут видны швы, т.к. jpeg преобразует изображение, сжимая с потерями. Вот png можно использовать.
0
PAnT0P
1029 / 553 / 106
Регистрация: 26.03.2012
Сообщений: 993
02.07.2013, 15:46 20
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ни как - в файле изображения обычно есть 0, что воспримется как конец строки и соответственно потеря дальнейших данных.
Позволю себе не согласится, любой бинарник можно сконвертировать в строку при помощи Base64 что и требуется ТС:
Цитата Сообщение от Bati4eli Посмотреть сообщение
главное это как сделанный снимок перевести в строку
0
02.07.2013, 15:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2013, 15:46

TCP: на клиента передать видеоизображение
железно есть видеосервер АХIS 241Q, на входе 4 видеокамеры, свой IP На компьютере есть чужая...

Передать xml файл по tcp
Есть клиентское приложение. Отправляем текст и в зависимости от содержания- получаем ответ. Код...

Передать массив byte по TCP
Имеется массив "byte b = ms.ToArray();" в котором содержится файл. Как передать этот массив по TCP?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.