Задача: прочитать с экрана текст, который выглядит как картинка. Допустим, прочитать текст выражения примера (24+37=):
(IMG:
http://cs315919.userapi.com/v315919099/5f72/YShC9g2Ipe8.jpg)
Решение:1) сделать PrintScreen и сохранить его в файл bmp (24 бит), а затем нарезать и сохранить _каждый_ символ или цифру в отдельный файл картинки формата bmp (24 бит).
Для упрощения жизни: картинкам цифр дать имена типа 0.bmp, 1.bmp и т.д., буквам a.bmp, b.bmp и т.д., знакам - plus.bmp, minus.bmp и т.д. (т.е. знакам- произвольные имена).
а) Внимание! В каждом файле изображения левый верхний пиксель должен быть цветом фона! При поиске этот цвет будет считаться прозрачным и не будет проверяться! Учитывайте это нарезая символы.
б) чтобы при поиске скрипт не путал цифры 3 и 8, а также знаки - и + (находя их в одном и том же месте экрана, если они очень похожи по написанию и накладываются друг на друга при поиске) - закрасьте в Paint левый верхний пиксель этих картинок любым посторонним цветом. Это "превратит" обычный "прозрачный" фон картинки в проверяемый цвет и не даст спутать похожие символы. Если символы и так не путаются, то можно с этим не заморачиваться.
2) все картинки разместить в одной папке, в которой больше нет подпапок с картинками
3) в эту же папку записать текстовый файл links.txt, в котором будут храниться соответствия между именами файлов (без расширения) и символами(строками), которые буду подставляться в результат при нахождении данной картинки.
Файл links.txt состоит из набора строк, каждая из которых состоит из 2-х значений:
<имя файла без расширения> <символ табуляции> <текстовый символ>
Например:
minus -
plus +
morda :-)
Если в файле links.txt не записано соответствие для картинки из папки, но картинка была найдена на экране, то в результат будет подставляться имя файла картинки без расширения. Т.е. цифры и отдельные буквы в файл links.txt вносить необязательно.
4) в начале скрипта в переменной $imgDir указываем полный путь к папке с картинками, имя файла связей, координаты области поиска, в которой следует искать картинки:
set $imgDir d:\Img\ // папка с картинками (с обратным слешем в конце)
set $linkName links.txt // файл связей "имя файла" tab "текст символа"
init_arr %region(1 2) 380, 320 453, 332 // координаты X1 Y1 X2 Y2 области поиска
Перед запуском скрипта не забываем привязать скрипт к рабочему окну.
А вот сам скрипт и архив с примерами картинок (нарезано только несколько цифр):
Скрипт
Код
// Чтение изображений с экрана с преобразованием в текст v.1.0
// Zeleax, 2013 (c)
set linedelay 1
set logging clear
set logging mode noTime noScript noNumber
set delimiter ' ' // разделитель между элементами массива в логе
set $imgDir d:\Img\ // папка с картинками (с обратным слешем в конце)
set $linkName links.txt // файл связей "имя файла" tab "текст символа"
init_arr %region(1 2) 380, 320 453, 332 // координаты X1 Y1 X2 Y2 области поиска
gosub parseRegion
msg Результат: $parseRegion
end_script
:parseRegion
set $ext .bmp // расширение файлов картинок
set $link $imgDir$linkName // полный путь к файлу линков
// получим список всех файлов bmp в каталоге
dir (%dir $imgDir *.bmp)
log В папке $imgDir найдено errorlevel картинок:
if errorlevel = 0
alarm
stop_script
end_if
// запишем в отдельный массив список файлов для проверки
set #sizeExt size($ext)
for #i 1 errorlevel
set %img[#i 1] %dir[#i 4] // только имя файла
set %img[#i 2] 99999 // порядковый номер для поиска
set #sz size( %img[#i 1] ) - #sizeExt // длина имени файла без расширения
set %img[#i 3] copy ( %img[#i 1] 1 #sz )
end_for
// проставим порядок файлов для проверки
load_array %link $link
set #linkSize size( %link )
log Загружено #linkSize строк связей
log Порядок проверки:
for #i 1 #linkSize
if size ( %link[#i 2] ) > 0 // есть данные во 2 столбце строки
set $fname %link[#i 1]$ext // нужное имя файла с расширением
// ищем нужное имя в списке файлов папки
set #n indexOf ( %img 1 ($fname))
if #n > 0 // если есть файл - ставим ему порядковый номер поиска
set %img[#n 2] #i // порядковый номер для поиска
set %img[#n 3] %link[#i 2] // подставляем текст символа
end_if
log $fname - #i
else
break // прерываем нумерацию
end_if
end_for
set #imgSize size( %img ) // число файлов-картинок в папке
// сортируем имена файлов картинок по порядку поиска
for #i 1 #imgSize
set #min %img[#i 2]
set #imin #i
set #ii #i + 1
for #j #ii #imgSize
if %img[#j 2] < #min
set #min %img[#j 2]
set #imin #j
end_if
end_for
// меняем местами минимальный элемент с текущим, используя промежуточную #z
set #z %img[#i 2] // номер проверки
set %img[#i 2] %img[#imin 2]
set %img[#imin 2] #z
set $z %img[#i 1] // имя файла
set %img[#i 1] %img[#imin 1]
set %img[#imin 1] $z
set $z %img[#i 3] // текст символа
set %img[#i 3] %img[#imin 3]
set %img[#imin 3] $z
end_for
// Ищем по порядку каждую картинку
set #x1 %region[1 1]
set #y1 %region[1 2]
set #x2 %region[2 1]
set #y2 %region[2 2]
log Ищем в области #x1 , #y1 - #x2 , #y2
log Результаты поиска картинок
set size ( %res ) // пустой массив для накопления результатов поиска
set #r 0 // счетчик номера найденного по порядку изображения
for #i 1 #imgSize
set $fname $imgDir%img[#i 1]
log Ищем: $fname
set #a findimage (#x1 #y1 #x2 #y2 ( $fname ) %arr workwindow 90 )
set #arrSize size(%arr)
for #j 1 #arrSize
set #r #r + 1
set %res[#r 1] %img[#i 3] // сохраняем текст символа и координату X
set %res[#r 2] %arr[#j 1]
log %res[#r 1] : %res[#r 2]
end_for
end_for
log Всего найдено #r символов
if #r > 1
// Сортируем массив символов по порядку
for #i 1 #r
set #min %res[#i 2]
set #imin #i
set #ii #i + 1
for #j #ii #r
if %res[#j 2] < #min
set #min %res[#j 2]
set #imin #j
end_if
end_for
// меняем местами минимальный элемент с текущим, используя промежуточную #z
set #z %res[#i 2] // координата X
set %res[#i 2] %res[#imin 2]
set %res[#imin 2] #z
set $z %res[#i 1] // текст символа
set %res[#i 1] %res[#imin 1]
set %res[#imin 1] $z
end_for
// собираем массив в строку
set $str ''
for #i 1 #r
set $str $str%res[#i 1]
end_for
end_if
set $str trim ( $str ) // обрезаем пробелы
if size( $str ) > 0
set $parseRegion $str
else
set $parseRegion ''
end_if
log Результат: $parseRegion
return
Сообщение отредактировал Zeleax - 24.2.2013, 16:52