Szybkie wyszukiwanie pikseli

0

Za pomocą tego kodu:

procedure TForm1.Button3Click(Sender: TObject);
var
color : Tcolor;
color1: Tcolor;
i :integer;
j:integer;

begin
  color1:=32768;

    for i:=1 to 400 do
     begin
       for j:=1 to 400 do
        begin
          color:= Image1.Canvas.Pixels[i,j];

          if color=color1  then
            begin
              poziom:=i;
              pion:=j;
            end;
end;

 

Jednak ten sposób jest dla mnie zbyt powolny.Wyczytałem na necie że szybsze do takich operacji bedzie scanline.
Tylko nie wiem jak się tym posługiwac.

Nieważne jest nawet żeby obrazek był wczytywany do Image1. Po prostu chce znaleźc pozycje piksela danego koloru w jak najkrótszym czasie.
Czy ktoś pomoże?

0

Trochę pozmieniałem mój kod.Jednak nie daje to zadowalających rezultatów:
przy bitmapie 640x480 szukanie piksela trwa 400ms.
Jest to stanowczo za dużo dla mnie.Na pewno jest jakiś sposób na szybsze wyszukiwanie bo przecież profesjonalne programy graficzne potrafią
pracowac na kilkakrotnie większych bitmapach o wiele szybciej od mojego programu.
Czy może ktoś mi pomóc w optymalizacji tego kodu?

 Type
TRGBTripleArray = ARRAY[WORD] OF TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
var
   Row : pRGBTripleArray;
var
 x,y: Integer   ;
color1,color2: Tcolor ;
  Bitmap:TBitmap ;
begin
 color1:=01280;
Bitmap:=TBitmap.Create;
Bitmap.PixelFormat:=pf24bit;
bitmap.LoadFromFile('test.bmp');

                     for y:=1 to Bitmap.Height-1 do
                      begin

                       Row := Bitmap.ScanLine[y];
                               for x:=1 to Bitmap.Width-1 do
                                 begin
                                       color2:=strtoint(inttostr(Row[x].rgbtBlue)+inttostr(Row[x].rgbtGreen)+inttostr(Row[x].rgbtRed));
                                       if (color2=color1) then
                                           begin
                                             label1.caption:=x;
                                             label2.caption:=y;
                                             bitmap.Free;
                                      
                                           end;

                                end;


                     end;


end;




 
0

Na necie jest dostępne czasowe porównanie metod manipulacji pikselami. Czas po dany w ms:

Algorithm \ (Width x Height) 100x100 400x400 1600x100 100x1600
Pixels[] 4,700 81,300 81,300 81,200
Scanline 31 296 218 578
GetDIBits(*) 187 1,593 1,609 1,735
GetDIBits(**) 47 781 781 797

(*) Allocation, GetDIBits and SetDIBits/De-allocation of memory each time (1000x times)

(**) Allocation of memory and GetDIBits before the 1000x loop, SetDIBits and De-allocation at the end


Opolski Portal Programistyczny
http://programowanie.opole.pl

0

A jakby tak do pracy zaciągnąc GPU?
na pewno byłoby to o wiele szybciej?
Tylko jak w ogóle się za takie coś zabrac?

0

chcesz szybko, a piszesz takie coś wewnątrz pętli
color2:=strtoint(inttostr(Row[x].rgbtBlue)+inttostr(Row[x].rgbtGreen)+inttostr(Row[x].rgbtRed));
921600 razy strtoint i tyleżsamo inttostr, brrrrrrr
wystarczy przecie
color:=Row[x];

1 użytkowników online, w tym zalogowanych: 0, gości: 1