Что нового

создание .png из скриншота (с экрана)

running-frag

why me?
Сообщения
441
Репутация
60
Вопрос не сложный (наверное), но как реализовать я лично не знаю :(
Задача сделать скрин определённого участка экрана. После увеличить его в два раза (дорисовывать ничего не надо). И сохранить куда нибудь как .png файл.


PS: Можно просто тыкнуть в готовый чужой скрипт. Т.е. ничего сложного не требуется я просто не знаю как "создаются" эти картинки с помощь GDIPlus. :(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вот то, что нужно http://autoit-script.ru/index.php/topic,340.0.html
только в строчке
Код:
$hThumb = _GDIPlus_GetImageThumbnail($hImage, _GDIPlus_ImageGetWidth($hImage) / 4, _GDIPlus_ImageGetHeight($hImage) / 4)

изменяешь деление на умножение
Код:
$hThumb = _GDIPlus_GetImageThumbnail($hImage, _GDIPlus_ImageGetWidth($hImage)*2, _GDIPlus_ImageGetHeight($hImage)*2)

скрипт сохраняет в jpg. измени расширение на png
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Такой ещё вопрос, а можно ли как то (я не знаю поэтому спрашиваю) отдать эту картинку в .exe через ShellExecuteWait (), не сохраняя в файл? Ну если "словами обывателя" создать картинку и передать её хэндл в .exe не сохраняя сам файл (речь не идёт о "создание а после удаление").
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
running-frag [?]
Ну если "словами обывателя" создать картинку и передать её хэндл в .exe не сохраняя сам файл (речь не идёт о "создание а после удаление").
видимо я до "обывателя" не дорос..не могу понять о чем речь :blink:
но понял одно, что это уже другая тема.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Ну я хочу передать "файл" не создавая его на харде :laugh:. Но походу так не получится. Меня просто сильно смущает момент (по скорости выполнения) "создания" файла и его "прочтения". :(
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Как можно создать скрин экрана в бин. код. Без сохранение на жесткий диск.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Создавать новую тему не стану, развиваем мыслю. Не получается "понять работу" функции _ScreenCapture_CaptureWnd (). Что там у неё с координатами вообще. :( Правильно ли я реализую "скрин определённого участка"? Или как заставить функцию _ScreenCapture_CaptureWnd () подчинятся опцией Opt ("PixelCoordMode", 2) ?

Код:
Opt ('MustDeclareVars',		1)		
Opt ("PixelCoordMode",		2)

#Include <GDIPlus.au3>
#Include <ScreenCapture.au3>

Local $_name = "" ;имя окна
Local $_hand = WinGetHandle ($_name)
WinActivate ($_name)
WinWaitActive ($_name)

;// SCREEN

Local $_x = 310;x
Local $_y = 305;y
Local $_w = $_x +150;x+ширина
Local $_h = $_y +300;y+высота

; ободки окна
Local $_xE = $_x +8
Local $_yE = $_y +36
Local $_wE = $_w +8
Local $_hE = $_h +36

_ScreenCapture_SetJPGQuality (100)
Local $hBitmap = _ScreenCapture_CaptureWnd ("", $_hand, $_xE, $_yE, $_wE, $_hE, False)
_GDIPlus_Startup ()
Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
_WinAPI_DeleteObject ($hBitmap)
Local $hThumb = _GDIPlus_GetImageThumbnail ($hImage, _GDIPlus_ImageGetWidth($hImage) *3, _GDIPlus_ImageGetHeight($hImage) *3)

_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageSaveToFile($hThumb, @DesktopDir & '\test.png')
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()

Func _GDIPlus_GetImageThumbnail ($_hImage, $iWidth, $iHeight)

  Local $Ret = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)
  If (@error) Or $Ret[0] Then
	  Return SetError(1,0,0)
  EndIf
  
  Return $Ret[4]
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
_ScreenCapture_CaptureWnd это функция помощник для _ScreenCapture_Capture которая "подготавливает" координаты

Как я понимаю, требуется сделать Screenshot клиентской части экрана? Если так, то вот код.
Код:
#include <WinAPI.au3>
#include <ScreenCapture.au3> ;Только для сохранения
$hWnd=WinWait("Безымянный")
$hDDC = _WinAPI_GetDC($hWnd)			;Получаем DC клиентской части окна
$hCDC=_WinAPI_CreateCompatibleDC($hDDC)	;Создаем CDC
$iHeight=_WinAPI_GetClientHeight($hWnd) ;Высота клиентской области
$iWidth=_WinAPI_GetClientWidth($hWnd)	;Ширина клиентской области
$hBMP=_WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) ;Будет создан пустой прямоугольник указанного размера
_WinAPI_SelectObject($hCDC, $hBMP)
$XSRC=0 ;X координата левого верхнего угла прямоугольника для захвата
$YSRC=0 ;Y координата левого верхнего угла прямоугольника для захвата
_WinAPI_BitBlt($hCDC, 0, 0, $iWidth, $iHeight, $hDDC, $XSRC, $YSRC, $__SCREENCAPTURECONSTANT_SRCCOPY) ;Копируем
_ScreenCapture_SaveImage(@ScriptDir&"\out.bmp", $hBMP, True) ;Сохраняем
_WinAPI_DeleteObject($hBMP)
 _WinAPI_DeleteDC($hCDC)
_WinAPI_DeleteDC($hDDC)

Сделает снимок клиентской части окна блокнота. $iHeight и $iWidth - собственно и определяют ширину конечной картинки. Естественно их можно поменять, например если ты хочешь изображение размером 100 на 100. $XSRC и $YSRC - определяют точко начала прямоугольника. Их можно задать если требуется "отступить" от начала клиентской части.

Как видно, не требуется активация окна для снимка, главное что бы окно не было свернуто.

P.S Если кто знает, как сделать снимок свернуто окна, покажите код :smile:
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
inververs [?]
Как я понимаю, требуется сделать Screenshot клиентской части экрана? Если так, то вот код.
А можно тебя попросить дописать "в твой код" возможность кода выше (а именно увеличения картинки). Потому что, повторюсь, для меня это очень дремучий лес. :( И как там правильно дописать я даже не знаю. :( Так же хочется в .png формате.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
#include <WinApiEx.au3>
#include <GDIPlus.au3>
#include <APIConstants.au3>
#include <ScreenCapture.au3> ;Только для сохранения

_GDIPlus_Startup()
Local $hDC, $hSrcDC, $hDstDC, $hDesktop, $hGraphics, $hBrush, $hImage, $hBitmap, $hScreen, $Rgb, $hPen = 0
$hWnd = WinWait("Безымянный")
$hDC = _WinAPI_GetDC($hWnd)
$hSrcDC = _WinAPI_CreateCompatibleDC($hDC) ; DC назначения
;~ $iSrcHeight = _WinAPI_GetClientHeight($hWnd) ;Высота клиентской области
;~ $iSrcWidth = _WinAPI_GetClientWidth($hWnd) ;Ширина клиентской области
$iSrcWidth = 100
$iSrcHeight = 100

$hScreen = _WinAPI_CreateCompatibleBitmap($hDC, $iSrcWidth, $iSrcHeight)
_WinAPI_SelectObject($hSrcDC, $hScreen)

_WinAPI_BitBlt($hSrcDC, 0, 0, $iSrcWidth, $iSrcHeight, $hDC, 0, 0, $SRCCOPY)
_ScreenCapture_SaveImage(@ScriptDir & "\out_orig.bmp", $hScreen, True) ;Сохраняем

;Увеличиваем в 4 раза
$iDstWidth = $iSrcWidth * 4
$iDstHeight = $iSrcHeight * 4

;Подготавливаем поверхность для увеличенного размера
$hDstDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iDstWidth, $iDstHeight)
_WinAPI_SelectObject($hDstDC, $hBitmap)

_WinAPI_SetStretchBltMode($hDstDC, $STRETCH_DELETESCANS)
_WinAPI_StretchBlt($hDstDC, 0, 0, $iDstWidth, $iDstHeight, $hSrcDC, 0, 0, $iSrcWidth, $iSrcHeight, $SRCCOPY)

_ScreenCapture_SaveImage(@ScriptDir & "\out_zoom.bmp", $hBitmap, True) ;Сохраняем

_WinAPI_ReleaseDC($hDesktop, $hDC)
_WinAPI_DeleteDC($hDstDC)
_WinAPI_DeleteDC($hSrcDC)
_WinAPI_DeleteObject($hScreen)

_GDIPlus_Shutdown()
Exit


На счет png формата.. тут немного сложнее
Можешь поискать все связанное с Alpha
Например
Код:
_WinAPI_AlphaBlend

Или вот http://www.autoitscript.com/forum/topic/51103-resources-udf/ - хорошая библиотека для изучения.
P.s т.к многие вещи уже придуманы раннее, то не надо изобретать велосипед. Пользуйся поиском, смотри примеры и многие вещи станут понятнее.
 
Верх