Вверх ↑
Ответов: 35
Рейтинг: -1
#1: 2017-05-27 22:37:45 ЛС | профиль | цитата
Sersey писал(а):
А если сначала уменьшить исходную картинку, быстро найти приблизительное местоположение пикселя, а потом искать на большой картинке в маленьком квадрате.

На все эти действия уходит много времени. Приходится бороться за сотые доли секунд.
Преобразование размеров и пересчет координат требуют дополнительных операций, как следствие теряем время в циклах и приходим к тому же результату. Тем более при изменении размера можно потерять часть уникальных пикселей.
Лучший вариант это прямой доступ к области памяти, в которой хранится изображение. Как посоветовал andrestudio
на данный момент считаю что лучший выход из положения это работа с DIB форматом.
Но все же не покидают мысли о ScanLine , даже нарыл кое что..
Но не могу сообразить как впихнуть это в IC.
Вариант со ScanLine
function GetColorXY(Graphic: TGraphic; Color: TColor; var X, Y: Integer): Boolean;
var
Bmp: TBitmap;
i, j: Integer;
Pixel, CmpColor: Cardinal;
Scan: Pointer;
R, G, B: Byte;
begin
Result:=false;
CmpColor:=ColorToRGB(Color);
Bmp:=TBitmap.Create;
try
Bmp.Assign(Graphic);
Bmp.PixelFormat:=pf24bit;
for i:=0 to Bmp.Height - 1 do begin
Scan:=Bmp.ScanLine[i];
for j:=0 to Bmp.Width - 1 do begin
Pixel:=PCardinal(Integer(Scan) + j*3)^;
R:=GetBValue(Pixel);
G:=GetGValue(Pixel);
B:=GetRValue(Pixel);
if RGB(R, G, B) = CmpColor then begin
Result:=true;
X:=j + 1;
Y:=i + 1;
Exit;
end;
end;
end;
finally
Bmp.Free;
end;
end;

Кстати с поиском получилось использовал код с форума решил искать кусочек изображения,
но возникла проблема с курсором мыши
Поиск
https://cloud.mail.ru/public/8S5M/CHsf2diR7
Залипает на месте... Чувствую баловство все это... Придется писать всю прогу голым кодом без кубиков...
карма: -4
Нечего сказать по делу? Просто проходим на natribu.org
0
Редактировалось 4 раз(а), последний 2017-05-27 23:20:21