![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Доброго времени суток. Скажу сразу - уже мало что соображаю, ибо долго сидел с этим кодом
. Вроде и пустяк, но никак не могу развязать этот узел.Мне надо найти определенный пиксель в компоненте 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; |
| Этот пользователь сказал Спасибо 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;Последний раз редактировалось 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; |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Так нужно найти отдельный пиксел или всю группу?
|
|
#9
|
||||
|
||||
|
На той картинке что в архиве нужно найти пиксель с координатами 369, 226.
Дело в том что пикселей с таким цветом много, и я взял последовательность группы пикселей (30 штук, что в массиве). Но эта последовательность мне нужна лишь чтобы подтвердить что первый пиксель этой группы - именно тот что мне нужен. |
|
#10
|
||||
|
||||
|
Если так, то по этой координате другой цвет, а именно $CBCBCB (13355979).
А нет, всё верно. Забыл что отсчёт идёт снизу. Последний раз редактировалось angvelem, 27.08.2013 в 01:29. |
|
#11
|
||||
|
||||
|
А у меня показывает 13224393. Закомментируйте строку
Код:
CursorPosition:= FindAreaPhoto(0, 0, Image1.Width, Image1.Height); |
|
#12
|
||||
|
||||
|
Я смотрел координаты в графическом редакторе. Если считать снизу картинки, то тогда нужный цвет существует по указанным координатам.
|
|
#13
|
||||
|
||||
|
Странно получается - ведь все координаты на компьютере идут с левого верхнего угла монитора!
Ладно, цвет цветом. Можете более детально объяснить насчет этого участка кода? Цитата:
![]() |
|
#14
|
||||
|
||||
|
У битмапов с нижнего левого.
Сейчас уже поздно (или рано), днём посмотрю. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Speech (27.08.2013)
| ||
|
#15
|
||||
|
||||
|
Поиск подправил, но искомая комбинация не найдена.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Speech (27.08.2013)
| ||