Porównywanie grafik w image'ach

0

Witajcie
Mam pytanie do forumowiczów. Ja można porównać dwa pliki graficzne umieszczone w komponentach TImage?

0

hmm np jak?

mozesz porównywać piksel po pikselu :D za pomocą wlasciwosci pixels Canvasa. Tylko nie mozesz ladowac obrazkow do TImage tlyko malowac po ich canvasie...

0

wlasciwosci pixels Canvasa

Eee - to by trwało o wieele za długo.

Robisz tak:

  1. sprawdzasz rozmiar obu obrazów; jeśli mają taki sam rozmiar to...
  2. ...wykonujesz pętle po obu obrazach w celu sprzwdzenia kolorów poszczególnych pikseli (za pomocą ScanLine, of course); jeśli wszystkie piksele zgadzają się, to obrazy są identyczne
  3. enjoy ;)
0

Cy to o coś w tym stylu chodzi:

if image1.Picture.Bitmap.ScanLine[3] =image2.Picture.Bitmap.ScanLine[3] then
label1.Caption:='r'
else
label1.Caption:='n';

??

0

CRC :)

Sam zrobilem programik ktory nagrywa obraz z kamery i porownuje klatke aktualna z poprzednia (przez crc) i jesli sa rozne to zaczyna nagrywanie. Czyli tak jakby fotokomorka plus nagrywanie poruszajacego sie obrazu:D

0

Możesz mi przybliżyć temat CRC, bo spotykam cię z tym pierwszy raz. Ucieszyłbym się gdybyś mi powiedział jak za pomocą CRC porównać te dwa rysunki.

0

Najlepiej jakbys zrobil to tak:

  1. Zapisujesz oba obrazki np image1.bmp image2.bmp
  2. Obliczasz sume kontrolna (CRC32) image1.bmp i image2.bmp
  3. Sprawdasz czy CRC sa takie same
  4. Jesli tak co cos tam jesli nie to cos tam :)

A jesli chodzi o te CRC to poszukaj na torry.net google znajdziesz po kilku minutach :)

0

Ale jeden obrazek moze byc przesuniety 2 pixele w prawo, i dupa.
Kiedys byl temat o porownywaniu stringow, poszukaj [diabel]

0
function Porownaj(Image1, Image2: TImage) : integer;
var x, y: integer;
  liczba: LongInt;
  punkt1, punkt2: PByteArray;
  procent: double;
const max_roznica=5;

begin
  liczba:=0;
  for y:=0 to image1.Picture.Bitmap.height-1 do begin
    punkt1:=image1.Picture.Bitmap.scanline[y];
    punkt2:=image2.Picture.Bitmap.scanline[y];
    for x:=0 to image1.Picture.Bitmap.width-1 do
      if abs(punkt1[x]-punkt2[x])>max_roznica then 
        inc(liczba);
    if image1.Picture.Bitmap.height*image1.Picture.Bitmap.width>0 then 
      procent:=100*(liczba/(image1.Picture.Bitmap.height*
      image1.Picture.Bitmap.width))
    else
      procent:=0;
    Result := 100-round(procent);
  end;
end;
Teraz jeszcze tylko posłużmy się nią 

Label1.Caption:= 'Rysunki podobne są do siebie w '+
IntToStr(Porownaj(Image1,Image2))+' procentach';
Image1 i Image2 to obiekty klasy TImage zawierające rysunki w formacie BMP. Funkcja nie jest skomplikowana, przeanalizuj ją, a zrozumiesz jak działa.
0

Ta funkcja nie działa mi do końca, ale to chyba, dlatego że musze napisać coś w stylu:

image43:=image43.Create()

, ale nie wiem, co dać w nawiasie, wie ktoś może?

0

co Ci nie działa ??

0

Gdy chce porównać rysunki pokazuje się błąd 'Access Volation...' i pokazuje pierwszą linijke kodu w tej funkcji. Wedłuk mnie chodzi o to że przedtem należy do zmiennej typu timage podstawiś jakiś komponent coś w stylu:

image:=image1.create(...) 

tylko nie wiem co wpisać w nawiasie.

0

Jeśli towrzysz dynamicznie te Imagi to:

image43:=TImage.Create(self);

a co bardziej prawdopodobne to:

image[43]:=TImage.Create(self);

Ale chyba nie o to chodzi [???]

0

Problem rozwiązany ale czasami gdy porównuje obrazki pojawia się błąd "Scan Line Index out of range", co jest jego przyczyną??

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