|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Помогите исправить алгоритм поиска пикселя в TImage
Доброго времени суток. Скажу сразу - уже мало что соображаю, ибо долго сидел с этим кодом . Вроде и пустяк, но никак не могу развязать этот узел.
Мне надо найти определенный пиксель в компоненте TImage. Для этого я написал 2 функции. Эта функция собственно ищет любой пиксель с заданным цветом и возвращает его координаты: Код:
{тип на координаты курсора, будет использоваться в функции по поиску пикселя} type CursorXY = record X : Integer; Y : Integer; Res : Boolean; end; {функция поиска пикселя FindColor - цвет который будем искать X, Y - координаты с которых будем начинать поиск StopX, StopY - по каким координатам будем прекращать поиск} function FindPixel(FindColor, X, Y, StopX, StopY: Integer): CursorXY; var X1 : Integer; Flag : Boolean; begin Result.Res:= False; Flag := False; while Y <= StopY-1 do begin for X1:= X to StopX-1 do begin SetCursorPos(X1, Y); if Form1.Image1.Picture.Bitmap.Canvas.Pixels[X1, Y] = FindColor then begin Result.X := X1; {возвращаем координаты найденного пикселя} Result.Y := Y; Result.Res := True; {а также информацию о том что пиксель найден} Flag := True; {мы нашли наш пиксель} Break; {значит выходим из цикла} end; end; if Flag then {если завершили внутренний цикл - завершаем и внешний} Break; Inc(Y); end; end; Эта функция сверяет относительно найденного пикселя последующий пиксели (типа по маске), чтобы найти именно тот пиксель который мне нужен, ибо с одинаковыми цветами таких пикселей много. Код:
const {массив цветов пикселей на начало фона картинки, на данной картинке это координаты 369, 226} ArrayAreaPhoto : array[0..30] of Integer = (13224393, 13027014, 13290186, 12698049, 13224393, 12500670, 13158600, 12829635, 12895428, 12566463, 12961221, 13158600, 13487565, 12829635, 13224393, 12961221, 13224393, 13224393, 13355979, 13158600, 13290186, 13224393, 13290186, 12763842, 13487565, 13027014, 13619151, 12895428, 13224393, 13092807, 13290186); {функция проверки по маске} function FindAreaPhotoEX(X, Y: integer): Boolean; var i: Integer; begin for i:= 0 to 30 do begin if Form1.Image1.Picture.Bitmap.Canvas.Pixels[X, Y] <> ArrayAreaPhoto[i] then begin Result:= False; Exit; end; Inc(X); end; Result:= True; end; Код:
{функция поиска начала фона под картинкой X, Y - координаты начала поиска, обычно 0, 0 StopX, StopY - по каким координатам будем прекращать поиск} function FindAreaPhoto(X, Y, StopX, StopY: Integer): CursorXY; var CursorPosition : CursorXY; begin Result.Res := False; CursorPosition.X:= X; CursorPosition.Y:= Y; while True do {крутим пока что вечный цикл, пока не найдем маску} begin {я думаю что ошибка в этой строке, но ума не приложу что еще не так} CursorPosition:= FindPixel(ArrayAreaPhoto[0], CursorPosition.X, CursorPosition.Y, StopX, StopY); {если первый пиксель найден - проверяем маску} if CursorPosition.Res and (CursorPosition.X < StopX-30) then begin {Если нашли маску - завершаем работу функции} if FindAreaPhotoEX(CursorPosition.X, CursorPosition.Y) then begin {но сюда мы почему то никогда не попадаем!} Result.X := CursorPosition.X; Result.Y := CursorPosition.Y; Result.Res := True; Exit; end; Inc(CursorPosition.X); {нам же в другой раз нужен следующий пиксель по координате X} end; end; end; |
#2
|
||||
|
||||
Код:
Flag := True; {мы нашли наш пиксель} Break; {значит выходим из цикла} end; end; if Flag then {если завершили внутренний цикл - завершаем и внешний} Break; Код:
Flag := True; {мы нашли наш пиксель} Exit; {значит выходим из функции} end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Speech (26.08.2013)
|
#3
|
||||
|
||||
angvelem, спасибо конечно за поправку. Но если бы кто подсказал как найти тот пиксель с координатами 369, 226 - было бы здорово
|
#4
|
||||
|
||||
Пока архив не смотрел.
Разберись с Код:
function FindAreaPhotoEX(X, Y : Integer) : Boolean; var I : Integer; begin Result := False; for I := 0 to 30 do begin if Form1.Image1.Picture.Bitmap.Canvas.Pixels[X, Y] <> ArrayAreaPhoto[i] then Exit; Inc(X); end; Result := True; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 26.08.2013 в 23:31. |
#5
|
||||
|
||||
Код:
function FindAreaPhoto(X, Y, StopX, StopY : Integer) : CursorXY; begin ... // Возвращает найденную позицию, к примеру 1310 по X CursorPosition := FindPixel(ArrayAreaPhoto[0], CursorPosition.X, CursorPosition.Y, StopX, StopY); ... // наращивает, но в следующем цикле, FindPixel опять вернёт 1310 // и так до бесконечности Inc(CursorPosition.X); {нам же в другой раз нужен следующий пиксель по координате X} ... end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
Цитата:
|
#7
|
||||
|
||||
Цитата:
|
#8
|
||||
|
||||
Так нужно найти отдельный пиксел или всю группу?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
||||
|
||||
На той картинке что в архиве нужно найти пиксель с координатами 369, 226.
Дело в том что пикселей с таким цветом много, и я взял последовательность группы пикселей (30 штук, что в массиве). Но эта последовательность мне нужна лишь чтобы подтвердить что первый пиксель этой группы - именно тот что мне нужен. |
#10
|
||||
|
||||
Если так, то по этой координате другой цвет, а именно $CBCBCB (13355979).
А нет, всё верно. Забыл что отсчёт идёт снизу. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 27.08.2013 в 01:29. |
#11
|
||||
|
||||
А у меня показывает 13224393. Закомментируйте строку
Код:
CursorPosition:= FindAreaPhoto(0, 0, Image1.Width, Image1.Height); |
#12
|
||||
|
||||
Я смотрел координаты в графическом редакторе. Если считать снизу картинки, то тогда нужный цвет существует по указанным координатам.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
||||
|
||||
Странно получается - ведь все координаты на компьютере идут с левого верхнего угла монитора!
Ладно, цвет цветом. Можете более детально объяснить насчет этого участка кода? Цитата:
|
#14
|
||||
|
||||
У битмапов с нижнего левого.
Сейчас уже поздно (или рано), днём посмотрю. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Speech (27.08.2013)
|
#15
|
||||
|
||||
Поиск подправил, но искомая комбинация не найдена.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Speech (27.08.2013)
|