Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2010, 19:31   #1
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
Лампочка Разрезать картинку на буквы

люди подскажите как мне вывести буквы поочередно в image (например P потом R следующая O и т.д.)
Безымянный.jpg
Я вкурсе что нужно читать по пиксилям с черным цветом, но не знаю как это написать
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 17.11.2010, 20:18   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Процесс называется "распознавание каптчи".
Вот по этому слову "каптча" (еще и по "капча" - многие пишут неграмотно ) и ищите на форуме и в инете.
Уже обсуждалось.
mihali4 вне форума Ответить с цитированием
Старый 17.11.2010, 21:52   #3
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Нашел вот такой код, но он только выделяет первую строку и не могу сделать вывод каждой буквы в image
Код:
function TForm1.Parce1(Pic:TPicture;X: Integer): Boolean;
var
  i : Integer;
begin
  Result := False;
  with Pic do
    for i := 0 to Bitmap.Height - 1 do
      if Bitmap.Canvas.Pixels[x,i] = clBlack
        then
          begin
            Result := True;
            Break;
          end;
end;

function TForm1.Parce2(Pic:TPicture;Y, x1, x2: Integer): Boolean;
var
  i : Integer;
begin
  Result := False;
  with Pic do
    for i := x1 to x2 do
      if Bitmap.Canvas.Pixels[i,y] = clBlack
        then
          begin
            Result := True;
            Break;
          end;
end;

function TForm1.PreParse2(Pic:TPicture):TBitmap;
var
  i, q1, q2, j : Integer;
  md:Tbitmap;
begin
md:=TBitmap.create;
  q1 := 0;
  q2 := 0;
  with Pic do
    for i := 2 to Bitmap.Width - 3 do
      begin
        if (not Parce1(Pic,i - 2)) and (not Parce1(Pic,i - 1)) and Parce1(Pic,i) and Parce1(Pic,i + 1) then q1 := i;
        if Parce1(Pic,i - 1) and Parce1(Pic,i) and (not Parce1(Pic,i + 1)) and (not Parce1(Pic,i + 2))
          then
            for j := 2 to Bitmap.Height - 3 do
              begin
                if (not Parce2(Pic,j - 2,q1,i)) and (not Parce2(Pic,j - 1,q1,i)) and Parce2(Pic,j,q1,i) and Parce2(Pic,j + 1,q1,i) then q2 := j;
                if Parce2(Pic,j - 1,q1,i) and Parce2(Pic,j,q1,i) and (not Parce2(Pic,j + 1,q1,i)) and (not Parce2(Pic,j + 2,q1,i))
                  then begin

                    md.Assign(Parce3(Pic,q1,q2,i,j));
                    break;
                    end;
              end;
      end;
Result:=md;
end;

function TForm1.Parce3(Pic:TPicture;x1, y1, x2, y2: Integer): TBitmap;
var
 bmp : TBitmap;
begin
 with Pic.Bitmap do
 begin
  Canvas.Pen.Color := clRed;
  Canvas.MoveTo(x1-1, y1-1);
  Canvas.LineTo(x2+1, y1-1);
  Canvas.LineTo(x2+1, y2+1);
  Canvas.LineTo(x1-1, y2+1);
  Canvas.LineTo(x1-1, y1-1);
 end;
 bmp := TBitmap.Create;
 bmp.Height := 16;
 bmp.Width  := 16;
 StretchBlt(bmp.Canvas.Handle,0,0,16,16,Pic.Bitmap.Canvas.Handle,x1,y1,x2 - x1+1,y2 - y1+1,SRCCOPY);
 Result := bmp;
end;
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 22.11.2010, 04:47   #4
Prisioner
Google user
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 27
По умолчанию

Стало интересно. Делать было нечего. То, что получилось, выкладываю в архиве.

Уточнения, которые не очень ясно прокомментил в коде или не прокомментил вообще
1) Перед использованием картинку надо перевести в bmp (не реализовывал этого программно, просто в паинте переделал и загрузил в Image1 картинку в bitmap).

2) Назначаем "условно черный" цвет (так как по краям и в тонких местах букв цвет не черный, а серый).

Поиграв с точностью поиска для белого фона и конкретно данный картинки методом научного тыка был выбран rgb(150, 150, 150). rgb(100, 100, 100) не подходит. Стоит подбирать нечто между ними для большей точности.

Этот цвет присвоен переменной LikeBlack в коде

3) После формирования списка букв, посмотреть на неё в Image можно кликом/даблкликом по ней в листбоксе

P.S. Если что-то ещё не уточнил в комментариях в коде - могу ответить на возникший вопрос

P.P.S. Я знаю, что я наверняка что-то делаю коряво и наверняка что-то можно было сделать проще/быстрее. К конструктивной критике готов.
Вложения
Тип файла: rar ImgParsing.rar (305.5 Кб, 74 просмотров)
Pascal/Delphi
ICQ: 2881228

Последний раз редактировалось Prisioner; 22.11.2010 в 05:54.
Prisioner вне форума Ответить с цитированием
Старый 04.01.2011, 21:04   #5
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Prisioner Посмотреть сообщение
Стало интересно. Делать было нечего. То, что получилось, выкладываю в архиве.

Уточнения, которые не очень ясно прокомментил в коде или не прокомментил вообще
1) Перед использованием картинку надо перевести в bmp (не реализовывал этого программно, просто в паинте переделал и загрузил в Image1 картинку в bitmap).

2) Назначаем "условно черный" цвет (так как по краям и в тонких местах букв цвет не черный, а серый).

Поиграв с точностью поиска для белого фона и конкретно данный картинки методом научного тыка был выбран rgb(150, 150, 150). rgb(100, 100, 100) не подходит. Стоит подбирать нечто между ними для большей точности.

Этот цвет присвоен переменной LikeBlack в коде

3) После формирования списка букв, посмотреть на неё в Image можно кликом/даблкликом по ней в листбоксе

P.S. Если что-то ещё не уточнил в комментариях в коде - могу ответить на возникший вопрос

P.P.S. Я знаю, что я наверняка что-то делаю коряво и наверняка что-то можно было сделать проще/быстрее. К конструктивной критике готов.
Мне очень понравилось как вы это зделали везде искал подобное ненашёл а тут прям подносом))

У меня буквы прыгают немного и поэтаму програма распознаёт не по порядку а немного в разброс по высате чтоли... , как этого избежать? чтобы по парядку как идут так и ситывал у меня одна строка
jone вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшить картинку Krasi PHP 10 10.08.2010 19:53
Как получить картинку при наведении на другую картинку (ссылку) seeker1 JavaScript, Ajax 8 04.07.2010 19:42
Разрезать файл по частям KoBRaAndrey Общие вопросы Delphi 8 23.01.2010 19:03
Картинку на экран soonner Общие вопросы Delphi 1 13.12.2009 16:14
сколькими способами можно разрезать прямоугольник на n-ное количество частей? 4ingiz Общие вопросы Delphi 2 31.01.2008 06:40