Маючи картинку в форматі base64 і бажання дізнатись символи на цій картинці її можна розпізнати за допомогою бібліотеки Tesseract, відправити на будь-який сервіс розпізнавання, а також можна відправити на розпізнавання в програму CapMonstr2. Власне мені здається що розробники вирішили не продовжувати її розробляти, а перевести клієнтів на хмарну версію, проте, все таки мені здається що ліцензія на компьютері краще, ніж оплата за сервіс Saas.
Перш за все я розказував про це у своєму відео, тому однозначно покажу його в цій публікації, а уже нижче по тексту приведу код:
Не знаю, знаєте чи ні як з картинки одержати base64, тому перечислю нижче основні варіанти звідки він у нас може взятись:
Файл в base64
Наприклад коли в нас на комп’ютері збережений файл, і саме його потрібно відправити на розпізнавання, тоді потрібно прочитати його в масив байт, і тоді перевести в текстовий рядок base64. До цього способу також може належати варіант, коли ми скачали зображення у вигляді масиву байт, просто замість зчитування підставляємо аргументом в метод ToBase64String свій масив байт зображення.
string path = @"D:\image.jpg"; string base64 = Convert.ToBase64String(File.ReadAllBytes(path)); // одержали base64
HTML в base64
Можливий варіант коли у вікні браузера програми ZennoPoster у нас появилось зображення, яке нам потрібно розпізнати – тоді просто беремо цей HTML елемент, переводимо його у base64 використовуючи визов метода DrawToBitmap, який приймає аргумент false коли це не картинка, і true коли це картинка.
var he = instance.ActiveTab.FindElementById("zp_fr_hl_top_hl"); string base64 = he.DrawToBitmap(false); // якщо це блок string base64 = he.DrawToBitmap(true); // якщо це картинка
Скриншот в base64
Також ми можемо просто зробити скриншот області екрану, і саме його переводити в base64 для подальшої відправки на розпізнавання. Зручно тоді, коли наприклад перед відправкою проводиться зміна зображення, наприклад видаляються лишні елементи чи змінюється кількість кольорів.
string base64 = string.Empty; using(var bitmap = new Bitmap(1920,1080)){ using(var graphics = Graphics.FromImage(bitmap)){ graphics.CopyFromScreen(0,0,0,0,bitmap.Size); using (var ms = new MemoryStream()){ bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // при зміненому маштабі передати третій параметр EncoderParameter base64 = Convert.ToBase64String(ms.GetBuffer()); } } } return base64;
Так ось, в цей момент, коли у нас уже є зображення в форматі base64 ми можемо визвати метод CaptchaRecognition і передати туди наше зображення base64, вказавши модуль “CapMonster2.dll”. Після чого ZennoPoster дочекається розпізнавання і поверне результат.
return ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64, "CapMonsterModule=повне ім'я модуля");
Хочу відмітити, що у деяких випадках буде зручніше самостійно відправляти HTTP запити до CapMonster2 чи будь-якого іншого сервісу, так як це може зменшити кількість зверненнь за короткий проміжок часу (наприклад коли проєкт працює в багато потоків одночасно). Можливо або доповню цю публікацію, або створю нову, де розгляну варіант відправки на розпізнавання за допомогою HTTP метода POST і одержання результату методом GET.