Пришли отсюда:
http://crapware.aidf.org/forum/index.php?topic=2134.msg23102#msg23102Для начала замерил у себя перевод в градации серого через PIXELREPLACE на образце 100х100 pxl.
// PXLREPLACE 100х100 10000 pxl
// 8100 ms 0.81 ms/pxl
После попробовал через редактирование буфера.
Код такой:
STRSEPARATE("A:B:C:D:E:F", ":", $arr16) //=== перевод числа в HEX. Выход $HEX =
SUB(toHEX, $DEC)
$HEX = ""
WHILE($DEC > 0)
$cel = INT($DEC/16)
$ost = $DEC - $cel*16
IF($ost > 9)
$ost = $arr16[$ost - 10]
END_IF
$HEX = STRCONCAT($ost, $HEX)
$DEC = $cel
END_CYC
//LOGWRITE($HEX)
END_SUB
SUB(GREYSCALE, $x1, $y1, $x2, $y2)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
FOR($y=0, $y < ($y2 - $y1 + 1))
$adrDECwr = $startbufwr + ($y*($xmax+1)*4)
FOR($x=0, $x < ($x2 - $x1 + 1))
$c = PXL($x1+$x, $y1+$y)
$gray_canal = INT((0.299*COLORR($c)) + (0.587*COLORG($c)) + (0.114*COLORB($c)))
$gray = COLORGEN($gray_canal, $gray_canal, $gray_canal)
//LOGWRITE("$gray_canal = ", $gray_canal, " ", $gray)
toHEX($adrDECwr + $x)
WRITEMEM($pid, $HEX, $gray, 4)
$adrDECwr = $adrDECwr + 3
END_CYC
END_CYC
END_SUB
К сожалению выходит намного медленней, даже с учётом оптимизации
// GREYSCALE = 5.25 ms/pxl
// 10х10 ~555 мс, ~552 мс 5.52 ms/pxl
//GREYSCALE(70, 75, 79, 84)
// 20х20 400 pxl ~2167 мс 5.42 ms/pxl
//GREYSCALE(772, 432, 791, 451)
// 100х100 10000 pxl ~53956 мс, 52431 5.25 ms/pxl
//GREYSCALE(750, 426, 849, 525)
Не просто медленней, а в 6.5 раз медленней. Я надеялся, что запись в память будет намного быстрее, чем не предназначенная для записи одного пикселя PXLREPLACE. Досадно.
Но движемся дальше, ради чего всё это затевалось.
Реализовал на AutoIt алгоритм из SCREENin3 и получил на 100х100 10000 pxl...
// 100х100 10000 pxl ~1400 мс 0.14 ms/pxl
Всего в 6 раз быстрее кликера и PXLREPLACE. Ожидал большего.
Чуть оптимизировал и переделав структуру из DWORD (4 байта) в структуру равную длине строки пикселов стал читать и писать построчно по X.
Но ускорил всего на 9.2%
// 100х100 10000 pxl ~1270 мс 0.127 ms/pxl
Дальше пока ничего не придумал. Позамеряв скорость разных этапов, выяснилось, сто чтение и обработка занимает примерно 400 мс и остальные 870 мс занимает запись. Как ускорить пока не знаю.
В любом случае пока итог:
100х100 10000 pxl
// PXLREPLACE 8100 ms 0.810 ms/pxl
// +AutiIt 1270 ms 0.127 ms/pxl
Для области 100х100 1.27 секунды вроде и ничего.
Но для 300х300 уже 11.43 секунды. Это медленно.
А не дай бог 1000х1000, то это уже 127 секунд.
2 минуты Карл!Жду помощи, прежде чем браться за перевод "яркость-контраст".