Что нового

[Баг] в UDF ScreenCapture

Luke

Знающий
Сообщения
64
Репутация
14
ScreenCapture создаёт .bmp на 1 пиксел выше и шире чем ему указали, это вроде как специально сделали , вопрос зачем ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: баг в UDF ScreenCapture

Нормально все создает. Отсчет естественно идет от (0;0), в этом видать причина?
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Re: баг в UDF ScreenCapture

Хмм, при таком коде _ScreenCapture_Capture(@DesktopDir & "\log.BMP") я ожидал получить результат аналогичный кнопке print screen (1280x1024), а получил 1281х1025. Ладно будем считать это фичей.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: баг в UDF ScreenCapture

У меня _ScreenCapture_Capture(@DesktopDir & "\log.bmp") создает .bmp с точно такими же размерами, что и при нажатии на PrintScrn (PrintScr -> Ctrl+V в Photosop'е).
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Re: баг в UDF ScreenCapture

Код:
Func _ScreenCapture_Capture($sFileName = "", $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True)
	If $iRight = -1 Then $iRight = _WinAPI_GetSystemMetrics($__SCREENCAPTURECONSTANT_SM_CXSCREEN) ; =1280
	If $iBottom = -1 Then $iBottom = _WinAPI_GetSystemMetrics($__SCREENCAPTURECONSTANT_SM_CYSCREEN) ; =1024

	Local $iW = ($iRight - $iLeft) + 1 ; =1281 !
	Local $iH = ($iBottom - $iTop) + 1 ; =1025 !

Странно почему у вас не так, неужели _WinAPI_GetSystemMetrics выдаёт другие значения (меньше на 1) ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: баг в UDF ScreenCapture

Luke, я понял твою логику. Но $iLeft, $iTop, $iRight и $iBottom в этой функции, да и вообще везде, где они встречаются, есть эквивалент RECT структуры, где $iRight и $iBottom есть не последняя точка правого нихнего угла прямоугольника, а точка, следующая непосредственно за ней.

Microsoft сказал(а):
By convention, the right and bottom edges of the rectangle are normally considered exclusive. In other words, the pixel whose coordinates are ( right, bottom ) lies immediately outside of the rectangle. For example, when RECT is passed to the FillRect function, the rectangle is filled up to, but not including, the right column and bottom row of pixels.
Поэтому следующая запись является неправильной.

Код:
$iW = ($iRight - $iLeft) + 1


Ширина прямоугольника вычисляется так (просто и логично):

Код:
$iW = $iRight - $iLeft


Как и записано в функции _ScreenCapture_Capture().

:smile:
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Re: баг в UDF ScreenCapture

Я именно это и хотел сказать, что
Код:
$iW  = ($iRight - $iLeft) + 1

неправильно.
Окончательно запутался, видимо у нас разные UDF, скачал вот этот архив http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-sfx.exe
в нём $iW = ($iRight - $iLeft) + 1 :(, это только у меня так ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: баг в UDF ScreenCapture

:shok:

Ух ты.

Я тестировал на 3.3.4.0. :whistle:

Да, действительно эту :Censored: придумали в 3.3.5.4. Вот тикет - №1446.

Видимо Jon'у что-то в голову дало...

Это действительно баг!
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Re: баг в UDF ScreenCapture

http://autoit-script.ru/index.php?topic=1298.0
вот здесь указано:
[box title=TitleBox]UDFs:
Исправлено #1438: Ошибка при использовании _ArrayCombinations().
Исправлено #1454: Некорректная работа StringBetween().
Исправлено #1441: _GUICtrlRichEdit_GetText() использовала неправильную длину буфера.
Исправлено #1446: _ScreenCapture_Capture() по высоте и ширине использовала на 1 пиксель меньше.
Исправлено #1445: Обновлена документация к _MemGlobalFree().
Исправлено #1469: Обновлена документация к _GDIPlus_BitmapCloneArea().
Исправлено #1466: _GUICtrlEdit_GetLine() возвращает непредвиденный символ.
Исправлено #1487: _DateToDayOfWeekIso возвращала 0-6 а должна возвращать 1-7 где Monday = 1[/box]
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Re: баг в UDF ScreenCapture

Исправление нужно делать в _ScreenCapture_CaptureWnd:

Код:
Func _ScreenCapture_CaptureWnd($sFileName, $hWnd, $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True)
	Local $tRect = _WinAPI_GetWindowRect($hWnd)
	Local $aWinClientSize, $aWinPos, $iBorder
	
	If BitAND(WinGetState($hWnd), 32) Then ;window is maximized
		$aWinClientSize = WinGetClientSize($hWnd)
		$aWinPos = WinGetPos($hWnd)
		If Not @error Then $iBorder = ($aWinPos[2] - $aWinClientSize[0]) / 2
	EndIf
	
	$iLeft += DllStructGetData($tRect, "Left") + $iBorder
	$iTop += DllStructGetData($tRect, "Top") + $iBorder
	If $iRight = -1 Then $iRight = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left") - $iBorder
	If $iBottom = -1 Then $iBottom = DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top") - $iBorder
	$iRight += DllStructGetData($tRect, "Left")
	$iBottom += DllStructGetData($tRect, "Top")
	If $iLeft > DllStructGetData($tRect, "Right") Then $iLeft = DllStructGetData($tRect, "Left")
	If $iTop > DllStructGetData($tRect, "Bottom") Then $iTop = DllStructGetData($tRect, "Top")
	If $iRight > DllStructGetData($tRect, "Right") Then $iRight = DllStructGetData($tRect, "Right")
	If $iBottom > DllStructGetData($tRect, "Bottom") Then $iBottom = DllStructGetData($tRect, "Bottom")
	Return _ScreenCapture_Capture($sFileName, $iLeft, $iTop, $iRight, $iBottom, $fCursor)
EndFunc


т.е нужно ещё подсчитать размер бортика окна.


Добавлено:
Сообщение автоматически объединено:

Запостил тикет.
 
Верх