Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!
Интересует 2 вещи:
  • Как сделать снимок экрана НЕ используя буфер обмена.
  • И результат передать по протоколу TCP ?
Сам процесс передачи не очень важен, главное это как сделанный снимок перевести в строку и потом при получении строки получить из неё картинку обратно!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2013, 16:38
Ответы с готовыми решениями:

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

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

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

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

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

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

Все остальные существующие в проекте преобразования крайне неэффективны(слишком долго выполняются), не рекомендую их использовать.
Хотя если требуется сделать снимок небольшой части экрана, то можно попробовать.
Миниатюры
Как передать скриншот (принтскрин) по TCP ?  
Вложения
Тип файла: rar PrintScreen.rar (2.3 Кб, 48 просмотров)
2
Заблокирован
25.06.2013, 21:26
Вирусы пишем.
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
25.06.2013, 22:17  [ТС]
@SoftIce,
а могли бы привести пользовательский тип DEVMODE ?
@Pro_grammer,
сам алгоритм передачи файла у меня наработан, и кстати при использовании TCP у меня скорость передачи файлов не привышает 100кб/с поэтому нужно как-то исключать такой принцип передачи как :
передал- получил ответ - передал..
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
25.06.2013, 22:20
Цитата Сообщение от 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
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
25.06.2013, 22:35  [ТС]
@SoftIce, да действительно очень долго выполняется.
Но в любом случае спасибо за пример. Наверно даже быстрее сохранить изображение в файл и передать уже его..

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

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

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

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

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

Добавлено через 7 минут
Pro_grammer,
Я тоже думаю что нужно разбивать скрин на куски и сравнивать их .. но в таком случае нужно использовать функции GetPixel и SetPixel, я их пробовал но что-то их скорость меня не вдохновила на дальнейшее их использование.
Может есть какие наброски на практике ?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
02.07.2013, 12:20
Цитата Сообщение от Bati4eli Посмотреть сообщение
в таком случае нужно использовать функции GetPixel и SetPixel
Это зло! Используй GetDIBits, очень быстро получишь значения всех пикселей. Если смогу выложу пример. Я думаю для непрерывной передачи (что можно сказать является видео) можно рыть в сторону потокового видео. Всю работу по сравниванию блоков возьмет на себя кодек.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 327
Записей в блоге: 1
02.07.2013, 12:55
Лучший ответ Сообщение было отмечено 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
1492 / 587 / 107
Регистрация: 26.03.2012
Сообщений: 1,039
02.07.2013, 15:46
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ни как - в файле изображения обычно есть 0, что воспримется как конец строки и соответственно потеря дальнейших данных.
Позволю себе не согласится, любой бинарник можно сконвертировать в строку при помощи Base64 что и требуется ТС:
Цитата Сообщение от Bati4eli Посмотреть сообщение
главное это как сделанный снимок перевести в строку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.07.2013, 15:46
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru