Что нового

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

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
:blink:
Немного странно сделано. Почему отображение идет на серверной части, а передает клиентская? В Radmin, VNC и т.д. сделано наоборот...

Т.е. на удаленном компьютере кто-то должен запустить клиент и подключиться к моему серверу, чтобы я на серверной его части смог получить изображение...
Вместо того, чтобы сервер работал 24/7 и из любой точки к нему подключиться и увидеть картинку. :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Тебя напрягает 50-100 КБ? Можно конечно уменьшить качество самого JPEG, но тогда картинка будет вообще никакущая. Еще можешь передавать скриншот не 1:1, а с уменьшением. Все зависит от поставленных задач.

P.S

А в чем собственно проблема?
 

Arei

Скриптер
Сообщения
938
Репутация
115
просто вы писали что 800 на 800 весит 30-80 кб. А хотелось бы 1920 1080 что бы столько же весило.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Arei сказал(а):
просто вы писали что 800 на 800 весит 30-80 кб. А хотелось бы 1920 1080 что бы столько же весило.

Чудес не бывает.

:smile:
 

Arei

Скриптер
Сообщения
938
Репутация
115
а какой максимум?т.е увеличения разрешения экрана, и уменьшения размеров.Т.е какая будет золотая середина.

P.S
просто в ScreenCapture.au3
Код:
_ScreenCapture_SetJPGQuality(100)
_ScreenCapture_Capture($Screen, 500, 500, 1100, 1100, True)


можно настраивать,качество снимка,вот я про это и спрашиваю.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Настраивай, от 0 до 100. Но, IMHO, лучше пересылать 8-бит TIFF с LZW компрессией (по крайней мере все будет хорошо читаться).

Код:
#Include <GDIPlus.au3>
#Include <Memory.au3>
#Include <WinAPIEx.au3>

TCPStartup()
$Socket = TCPConnect(@IPAddress1, 33891)
If @error Then
	Exit
EndIf

_GDIPlus_Startup()

Global $tEncoder, $pEncoder, $tParams, $pParams, $tQuality

$tEncoder = _WinAPI_GUIDFromString(_GDIPlus_EncodersGetCLSID('jpg'))
$pEncoder = DllStructGetPtr($tEncoder)
$tParams = _GDIPlus_ParamInit(1)
$pParams = DllStructGetPtr($tParams)
$tQuality = DllStructCreate('int')
DllStructSetData($tQuality, 1, 50) ; 0-100
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, DllStructGetPtr($tQuality))

While 1
	TCPSend($Socket, _GetScreenshot(0, 0, 800, 600))
	If @error Then
		ExitLoop
	EndIf
	Sleep(1000)
WEnd

_GDIPlus_Shutdown()

TCPShutdown()

Func _GetScreenshot($iX = 0, $iY = 0, $iWidth = -1, $iHeight = -1)

	Local $hSrcDC, $hDstDC, $hDstSv, $hBitmap, $hDesktop, $hScreen, $hMemory, $pMemory, $pStream, $tOut, $pOut, $iSize

	If $iWidth = -1 Then
		$iWidth = @DesktopWidth
	EndIf
	If $iHeight = -1 Then
		$iHeight = @DesktopHeight
	EndIf
	$hDesktop = _WinAPI_GetDesktopWindow()
	$hSrcDC = _WinAPI_GetDC($hDesktop)
	$hScreen = _WinAPI_CreateCompatibleBitmap($hSrcDC, $iWidth, $iHeight)
	$hDstDC = _WinAPI_CreateCompatibleDC($hSrcDC)
	$hDstSv = _WinAPI_SelectObject($hDstDC, $hScreen)
	_WinAPI_BitBlt($hDstDC, $iX, $iY, $iWidth, $iHeight, $hSrcDC, $iX, $iY, $SRCCOPY)
	_WinAPI_SelectObject($hDstDC, $hDstSv)
	_WinAPI_ReleaseDC($hDesktop, $hSrcDC)
	_WinAPI_DeleteDC($hDstDC)
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hScreen)
	_WinAPI_DeleteObject($hScreen)
	$pStream = _WinAPI_CreateStreamOnHGlobal(0)
	_GDIPlus_ImageSaveToStream($hBitmap, $pStream, $pEncoder, $pParams)
	_GDIPlus_BitmapDispose($hBitmap)
	$hMemory = _WinAPI_GetHGlobalFromStream($pStream)
	$pMemory = _MemGlobalLock($hMemory)
	$iSize = _MemGlobalSize($hMemory)
	$tOut = DllStructCreate('dword;dword;byte[' & ($iSize - Mod($iSize, 4) + 4) & ']')
	$pOut = DllStructGetPtr($tOut)
	DllStructSetData($tOut, 1, DllStructGetSize($tOut))
	DllStructSetData($tOut, 2, $iSize)
	_MemMoveMemory($pMemory, $pOut + 8, $iSize)
	_MemGlobalFree($hMemory)
	ConsoleWrite(_WinAPI_StrFormatByteSize($iSize) & @CR)
	Return DllStructGetData(DllStructCreate('byte[' & DllStructGetSize($tOut) & ']', DllStructGetPtr($tOut)), 1)
EndFunc   ;==>_GetScreenshot

Func _GDIPlus_ImageSaveToStream($hImage, $pStream, $pEncoder, $pParams = 0)

	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipSaveImageToStream', 'ptr', $hImage, 'ptr', $pStream, 'ptr', $pEncoder, 'ptr', $pParams)

	If (@error) Or ($Ret[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return 1
EndFunc   ;==>_GDIPlus_ImageSaveToStream
 

Arei

Скриптер
Сообщения
938
Репутация
115
скажите а какой быстрее будет работать и всё.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Который размером меньше, JPEG.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Спасибо,всё работает,даже лучше чем я ожидал... :smile:
 

k0tone

Новичок
Сообщения
1
Репутация
0
Расскажите пожалуйста, как пользоваться данный скриптом.
я скачал Сервер и Клиент. Пытался запустить выдаёт ошибку:
C:\Documents and Settings\k0tone\??????? ????\Server2.au3 (115) : ==> Duplicate function name.:
Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize = 8388608)

Вопрос: что и как, в последовательности, нужно делать...
 

Favorite6233

Знающий
Сообщения
21
Репутация
5
Yashied [?]
Еще можешь передавать скриншот не 1:1, а с уменьшением.

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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Favorite6233
http://autoit-script.ru/index.php/topic,9182.0.html
в поиске по форуму введи "масштабирование изображения" или "обрезка изображения"
 

Favorite6233

Знающий
Сообщения
21
Репутация
5
joiner
Что-то похожее смотрел, но к примеру Yashied пока не получилось прикрутить. И ещё хотелось бы скроллинг изображения в окне сделать. Окно с полосками скроллинга сделать не проблема, но, я так понял, надо самому отслеживать изменения ползунков, а потом выводить изображение частично в это окно, я правильно понял? Хотелось бы, конечно, пример на эту тему.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Favorite6233
сделай отдельную тему. в эту твой вопрос не вписывается.
а то ругаться будут :smile:
 

Favorite6233

Знающий
Сообщения
21
Репутация
5
Сделал новую тему. А здесь к этой теме добавлю, что поставил качество jpg=10, изображение сжимается до 30-60 Кб и вполне можно читать текст. Для работы с удалённой машиной - более чем достаточно.
Ставил качесвто =1 - буквы различить невозможно, а вот 10 - в самый раз. ;)

Да, и ещё вопрос: в примере Yashied можно ли передавать изображение не в 24 бита цветности, а допустим в 16, 8 или 4 бита?
 

ZloePelme666ko

Новичок
Сообщения
18
Репутация
1
Ребят, простите, наверное это уже некропост, но не могли бы подсказать решение проблемы: Я пишу скрипт для трансляции картинки с экрана по HTTP... Все работает чинно-денно, но вот jpg-скриншот полученный в переменную последним способом(с изменением качества) отображается в браузере как эээ..."битая картинка" :(. При сохранении на диск иконка файла(уменьшенное изображение) тоже не создается, в смотрелке винды пишет "Не удается открыть изображение поскольку файл поврежден или слишком велик" но в FastStone ImageViewer она открывается как положено. подскажите, что поправить, башку уже сломал с WinAPI. Очень надо иметь возможность настраивать качество, http, сами понимаете :'(


update: из трех версий собрал таки одну рабочую. теперь это в UDF. качество настраивается, картинка возвращается в переменную. кому надо - пишите, выложу.
 
Верх