Автор Тема: [Баг] в UDF ScreenCapture  (Прочитано 5349 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Luke [?]

  • Новичок
  • *
  • Сообщений: 64
  • Репутация: 14
  • Пол: Мужской
    • Награды
[Баг] в UDF ScreenCapture
« Создано: Июнь 01, 2010, 15:01:23 »
ScreenCapture создаёт .bmp на 1 пиксел выше и шире чем ему указали, это вроде как специально сделали , вопрос зачем ?
« Последнее редактирование: Сентябрь 28, 2011, 15:17:36 от Luke »

Русское сообщество AutoIt

[Баг] в UDF ScreenCapture
« Отправлен: Июнь 01, 2010, 15:01:23 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: баг в UDF ScreenCapture
« Ответ #1, Отправлен: Июнь 01, 2010, 15:05:43 »
Нормально все создает. Отсчет естественно идет от (0;0), в этом видать причина?


Думай, прежде чем говорить.

Оффлайн Luke [?]

  • Новичок
  • *
  • Сообщений: 64

  • Автор темы
  • Репутация: 14
  • Пол: Мужской
    • Награды
Re: баг в UDF ScreenCapture
« Ответ #2, Отправлен: Июнь 01, 2010, 16:53:53 »
Хмм, при таком коде    _ScreenCapture_Capture(@DesktopDir & "\log.BMP") я ожидал получить результат аналогичный кнопке print screen (1280x1024), а получил 1281х1025. Ладно будем считать это фичей.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: баг в UDF ScreenCapture
« Ответ #3, Отправлен: Июнь 01, 2010, 17:18:08 »
У меня _ScreenCapture_Capture(@DesktopDir & "\log.bmp") создает .bmp с точно такими же размерами, что и при нажатии на PrintScrn (PrintScr -> Ctrl+V в Photosop'е).
« Последнее редактирование: Июнь 01, 2010, 17:36:14 от Yashied »

Русское сообщество AutoIt

Re: баг в UDF ScreenCapture
« Ответ #3 Отправлен: Июнь 01, 2010, 17:18:08 »

Оффлайн Luke [?]

  • Новичок
  • *
  • Сообщений: 64

  • Автор темы
  • Репутация: 14
  • Пол: Мужской
    • Награды
Re: баг в UDF ScreenCapture
« Ответ #4, Отправлен: Июнь 01, 2010, 22:35:34 »
Код: AutoIt [Выделить]
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 [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: баг в UDF ScreenCapture
« Ответ #5, Отправлен: Июнь 01, 2010, 22:59:40 »
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.

Поэтому следующая запись является неправильной.

Код: AutoIt [Выделить]
$iW = ($iRight - $iLeft) + 1


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

Код: AutoIt [Выделить]
$iW = $iRight - $iLeft


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

:)
« Последнее редактирование: Июнь 02, 2010, 00:51:29 от Yashied, Причина: Объединение сообщений »

Оффлайн Luke [?]

  • Новичок
  • *
  • Сообщений: 64

  • Автор темы
  • Репутация: 14
  • Пол: Мужской
    • Награды
Re: баг в UDF ScreenCapture
« Ответ #6, Отправлен: Июнь 02, 2010, 19:37:45 »
Я именно это и хотел сказать, что
Код: AutoIt [Выделить]
$iW  = ($iRight - $iLeft) + 1

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: баг в UDF ScreenCapture
« Ответ #7, Отправлен: Июнь 02, 2010, 20:08:35 »
:o

Ух ты.

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

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

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

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

Русское сообщество AutoIt

Re: баг в UDF ScreenCapture
« Ответ #7 Отправлен: Июнь 02, 2010, 20:08:35 »

Оффлайн Redline [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 506
  • Репутация: 369
  • Пол: Мужской
    • Награды
Re: баг в UDF ScreenCapture
« Ответ #8, Отправлен: Июнь 03, 2010, 09:22:04 »
http://autoit-script.ru/index.php?topic=1298.0
вот здесь указано:
TitleBoxUDFs:
Исправлено #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
Уроки по регулярным выражениям на AutoIt: RegExp

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: баг в UDF ScreenCapture
« Ответ #9, Отправлен: Июль 18, 2011, 17:32:23 »
Исправление нужно делать в _ScreenCapture_CaptureWnd:

Код: AutoIt [Выделить]
  1. Func _ScreenCapture_CaptureWnd($sFileName, $hWnd, $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True)
  2.     Local $tRect = _WinAPI_GetWindowRect($hWnd)
  3.     Local $aWinClientSize, $aWinPos, $iBorder
  4.    
  5.     If BitAND(WinGetState($hWnd), 32) Then ;window is maximized
  6.         $aWinClientSize = WinGetClientSize($hWnd)
  7.         $aWinPos = WinGetPos($hWnd)
  8.         If Not @error Then $iBorder = ($aWinPos[2] - $aWinClientSize[0]) / 2
  9.     EndIf
  10.    
  11.     $iLeft += DllStructGetData($tRect, "Left") + $iBorder
  12.     $iTop += DllStructGetData($tRect, "Top") + $iBorder
  13.     If $iRight = -1 Then $iRight = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left") - $iBorder
  14.     If $iBottom = -1 Then $iBottom = DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top") - $iBorder
  15.     $iRight += DllStructGetData($tRect, "Left")
  16.     $iBottom += DllStructGetData($tRect, "Top")
  17.     If $iLeft > DllStructGetData($tRect, "Right") Then $iLeft = DllStructGetData($tRect, "Left")
  18.     If $iTop > DllStructGetData($tRect, "Bottom") Then $iTop = DllStructGetData($tRect, "Top")
  19.     If $iRight > DllStructGetData($tRect, "Right") Then $iRight = DllStructGetData($tRect, "Right")
  20.     If $iBottom > DllStructGetData($tRect, "Bottom") Then $iBottom = DllStructGetData($tRect, "Bottom")
  21.     Return _ScreenCapture_Capture($sFileName, $iLeft, $iTop, $iRight, $iBottom, $fCursor)


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


Добавлено: Июль 18, 2011, 17:49:23
Запостил тикет.
« Последнее редактирование: Июль 18, 2011, 17:49:23 от CreatoR, Причина: Объединение сообщений »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: баг в UDF ScreenCapture
« Ответ #9 Отправлен: Июль 18, 2011, 17:32:23 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
2895 Просмотров
Последний ответ Июнь 24, 2010, 10:16:46
от Serhio
1 Ответов
1186 Просмотров
Последний ответ Ноябрь 25, 2013, 15:13:30
от InnI