Создание модуля: Как получить символы черными

one

Client
Регистрация
22.09.2015
Сообщения
6 834
Благодарностей
1 275
Баллы
113
Как получить символы черными если у некоторых капч фон светлый а некоторых темный. Как быть? Ведь наша цель насколько я понял получить черные символы на белом фоне.

upload_2017-7-15_18-33-9.png
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
Код:
Bitmap src = (Bitmap) Image.FromFile(project.Variables["z"].Value); // в переменной путь к картинке
int black = 0; // количество черных пикселей
int white = 0; // количество белых пикселей
for (int x = 0; x < src.Width; x++) {
    for (int y = 0; y < src.Height; y++) {
       if (src.GetPixel(x, y).Name=="ff000000") {
            black++;
        } else {
            white++;
        }
    }
}
На выходе в переменных black - количество черных пискелей, а в переменной white - количество белых пикселей.
Большее число - это фон, меньшее - символы.

При необходимости можно перекрасить :-)
Продолжение кода:
Код:
if (black>white) {
    white=0;
    black=0;
for (int x = 0; x < src.Width; x++) {
    for (int y = 0; y < src.Height; y++) {
        //project.SendInfoToLog(src.GetPixel(x, y).Name, true);
        if (src.GetPixel(x, y).Name=="ff000000") {
            src.SetPixel(x, y, Color.White);
            white++;
        } else {
            src.SetPixel(x, y, Color.Black);
            black++;
        }
    }
}
}
Того у нас получилось привести картинку к виду, где всегда белых пискелей больше чем черных.
Осталось сохранить картинку:
Код:
src.Save(@"C:\captcha\my_captcha.png"); // сохранение результата в файл
src.Dispose(); // очистка мусора
Собственно вот код, которым я обработал изображение - получил инвертированные цвета которые инвертировались только когда черных пискелей больше чем белых:

Код:
Bitmap src = (Bitmap) Image.FromFile(project.Variables["z"].Value);

int black = 0;
int white = 0;
for (int x = 0; x < src.Width; x++) {
    for (int y = 0; y < src.Height; y++) {
		if (src.GetPixel(x, y).R > 200 && src.GetPixel(x, y).G  > 200 && src.GetPixel(x, y).B  > 200) {
			src.SetPixel(x, y, Color.Black);
			black++;
		} else {
			src.SetPixel(x, y, Color.White);
			white++;
	}
}
}

if (black>white) {
	white=0;
	black=0;
for (int x = 0; x < src.Width; x++) {
    for (int y = 0; y < src.Height; y++) {
		if (src.GetPixel(x, y).Name=="ff000000") {
			src.SetPixel(x, y, Color.White);
			black++;
		} else {
			src.SetPixel(x, y, Color.Black);
			white++;
		}
	}
}
}
src.Save(@"F:\USER\Desktop\captcha_2.png");
src.Dispose();
до_после.jpg
 
  • Спасибо
Реакции: SHELBY и one

one

Client
Регистрация
22.09.2015
Сообщения
6 834
Благодарностей
1 275
Баллы
113
Юра, у Вас на скринах просто инвертирование. Не совсем понятно. Нужно же получить все картинки на белом фоне с черными буквами.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
Юра, у Вас на скринах просто инвертирование. Не совсем понятно. Нужно же получить все картинки на белом фоне с черными буквами.
Попробуйте выполнить пример на черной каптче.
Потом на белой каптче.
Потом забросьте сюда два результата и сравните.
 
  • Спасибо
Реакции: one

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 312
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

А де ты их нарыл ч/б?
Бедный XRB ))
Код:
var bmp = new Bitmap(file);
var bgColor = bmp.GetPixel(0, 0);
for (int i = 0; i < bmp.Width; i++)
{
    for (int j = 0; j < bmp.Height; j++)
    {
        var color = bmp.GetPixel(i, j);
        if (color==bgColor)
        {
            bmp.SetPixel(i,j, Color.White);
        }
        else
        {
            bmp.SetPixel(i, j, Color.Black);
        }
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: Karamzin и one

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113

one

Client
Регистрация
22.09.2015
Сообщения
6 834
Благодарностей
1 275
Баллы
113

one

Client
Регистрация
22.09.2015
Сообщения
6 834
Благодарностей
1 275
Баллы
113
А как тут указать путь к картинкам?
Код:
var bmp = new Bitmap(file);
var bgColor = bmp.GetPixel(0, 0);
for (int i = 0; i < bmp.Width; i++)
{
    for (int j = 0; j < bmp.Height; j++)
    {
        var color = bmp.GetPixel(i, j);
        if (color==bgColor)
        {
            bmp.SetPixel(i,j, Color.White);
        }
        else
        {
            bmp.SetPixel(i, j, Color.Black);
        }
    }
}
Позже попробую оба варианта.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
А как тут указать путь к картинкам?
Код:
var bmp = new Bitmap(file);
var bgColor = bmp.GetPixel(0, 0);
for (int i = 0; i < bmp.Width; i++)
{
    for (int j = 0; j < bmp.Height; j++)
    {
        var color = bmp.GetPixel(i, j);
        if (color==bgColor)
        {
            bmp.SetPixel(i,j, Color.White);
        }
        else
        {
            bmp.SetPixel(i, j, Color.Black);
        }
    }
}
Позже попробую оба варианта.
Или просто подставив путь...
Код:
var bmp = new Bitmap(@"c:\captcha.png");
Или вынести данный путь в переменную...
Код:
string file =project.Variables["file"].Value = @"c:\captcha.png";
var bmp = new Bitmap(file);
 
  • Спасибо
Реакции: andrwork и one

gelu4

Client
Регистрация
11.01.2015
Сообщения
166
Благодарностей
42
Баллы
28
Как загрузить каптчу из файла в CapMonster?
 
Последнее редактирование:

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Благодарностей
291
Баллы
63
Как загрузить каптчу из файла в CapMonster?
Код:
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] imageBytes = ms.ToArray();
  base64String = Convert.ToBase64String(imageBytes);
}
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1)
{
project.Variables["UrlError"].Value = tmp[1];
return tmp[0];
}
return result;
Путь к картинке должен лежать в переменной captcha__get

в 11 строке можно указать модуль распознавания
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "CapMonsterModule=полное_имя_модуля");
 
Последнее редактирование:

gelu4

Client
Регистрация
11.01.2015
Сообщения
166
Благодарностей
42
Баллы
28
Код:
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] imageBytes = ms.ToArray();
  base64String = Convert.ToBase64String(imageBytes);
}
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1)
{
project.Variables["UrlError"].Value = tmp[1];
return tmp[0];
}
return result;
Путь к картинке должен лежать в переменной captcha__get

UPD: Писал до удаление вашего поста. Пусть останется, может пригодится кому
спасибо, вопрос вернул)
 
  • Спасибо
Реакции: SHELBY

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
Код:
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] imageBytes = ms.ToArray();
  base64String = Convert.ToBase64String(imageBytes);
}
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1)
{
project.Variables["UrlError"].Value = tmp[1];
return tmp[0];
}
return result;
Путь к картинке должен лежать в переменной captcha__get

в 11 строке можно указать модуль распознавания
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "CapMonsterModule=полное_имя_модуля");
Этот весь код можно заменить на одну строку.
Или, если свести в одну строку, то могут ресурсы неправильно освобождаться?
C#:
string recognition = ZennoPoster.CaptchaRecognition(
"CapMonster2.dll",
Convert.ToBase64String(System.IO.File.ReadAllBytes(project.Variables["file"].Value)),
"CapMonsterModule=полное_имя_модуля");
 
  • Спасибо
Реакции: Dr.Pipetka и SHELBY

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Благодарностей
291
Баллы
63
Этот весь код можно заменить на одну строку.
Или, если свести в одну строку, то могут ресурсы неправильно освобождаться?
C#:
string recognition = ZennoPoster.CaptchaRecognition(
"CapMonster2.dll",
Convert.ToBase64String(System.IO.File.ReadAllBytes(project.Variables["file"].Value)),
"CapMonsterModule=полное_имя_модуля");
В 1 потоке работает все хорошо. В многопотоке пока не тестил
P.S. Автор того сниппета не я)
 

steklarul

Client
Регистрация
07.09.2016
Сообщения
164
Благодарностей
7
Баллы
18
Этот весь код можно заменить на одну строку.
Или, если свести в одну строку, то могут ресурсы неправильно освобождаться?
C#:
string recognition = ZennoPoster.CaptchaRecognition(
"CapMonster2.dll",
Convert.ToBase64String(System.IO.File.ReadAllBytes(project.Variables["file"].Value)),
"CapMonsterModule=полное_имя_модуля");
Здравствуйте Юра такой вопрос можно как то перекрасить черный пиксель в белый по координатом например вот так
upload_2017-7-21_23-39-25.png
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
Здравствуйте Юра такой вопрос можно как то перекрасить черный пиксель в белый по координатом например вот так
Посмотреть вложение 22088
Я не являюсь специалистом в этой области деятельности.
Все коды которые я использую - искал на данном форуме просто маленько изменял под свои нужды.

Чтобы закрасить пиксель нужно выполнить код:
Код:
 bmp.SetPixel(i,j, Color.White);
Где задать координаты пикселя и цвет в который закрашивать.
Но, на сколько я понимаю вопрос состоит в том какой логикой руководствоваться для разбивки картинки на символы - увы, для себя я еще не решил этот вопрос.
 

steklarul

Client
Регистрация
07.09.2016
Сообщения
164
Благодарностей
7
Баллы
18
Я не являюсь специалистом в этой области деятельности.
Все коды которые я использую - искал на данном форуме просто маленько изменял под свои нужды.

Чтобы закрасить пиксель нужно выполнить код:
Код:
bmp.SetPixel(i,j, Color.White);
Где задать координаты пикселя и цвет в который закрашивать.
Но, на сколько я понимаю вопрос состоит в том какой логикой руководствоваться для разбивки картинки на символы - увы, для себя я еще не решил этот вопрос.
Просто если была бы возможность закрасить эти места белым хотя бы один пиксель с верху вниз то можно разгадывать эту капчу без Capmonster метод который находится в статии Moadip
 

NoN

Пользователь
Регистрация
04.01.2015
Сообщения
183
Благодарностей
22
Баллы
18
Просто если была бы возможность закрасить эти места белым хотя бы один пиксель с верху вниз то можно разгадывать эту капчу без Capmonster метод который находится в статии Moadip
Дайте ссылку на эту статью если сложно. В профиле Moadip не нашел(
 

steklarul

Client
Регистрация
07.09.2016
Сообщения
164
Благодарностей
7
Баллы
18

steklarul

Client
Регистрация
07.09.2016
Сообщения
164
Благодарностей
7
Баллы
18
Всем привет кто может помочь хочу конвертировать картинку в формат bitmap я пробовал такой код но почему то нет результата
ZennoLab.CommandCenter.HtmlElement he = instance.GetTabByAddress("page").GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("div", "class", "captcha-image", "regexp", 0);
string toBitmap1 = he.DrawToBitmap(false);
string toBitmap2 = he.DrawToBitmap(true);
System.IO.File.WriteAllBytes(project.Variables["a"].Value, Convert.FromBase64String(toBitmap2));
return 0;
возможно проблема что tag картинки является div а не img
 

Zoron

Client
Регистрация
24.09.2014
Сообщения
145
Благодарностей
39
Баллы
28
Код:
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] imageBytes = ms.ToArray();
  base64String = Convert.ToBase64String(imageBytes);
}
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1)
{
project.Variables["UrlError"].Value = tmp[1];
return tmp[0];
}
return result;
Путь к картинке должен лежать в переменной captcha__get

в 11 строке можно указать модуль распознавания
var result = ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64String, "CapMonsterModule=полное_имя_модуля");
Не подскажешь, а рекапчу таким образом можно как-то решать?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)