Witajcie
Mam pytanie do forumowiczów. Ja można porównać dwa pliki graficzne umieszczone w komponentach TImage?
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...
wlasciwosci pixels Canvasa
Eee - to by trwało o wieele za długo.
Robisz tak:
- sprawdzasz rozmiar obu obrazów; jeśli mają taki sam rozmiar to...
- ...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
- enjoy ;)
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';
??
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
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.
Najlepiej jakbys zrobil to tak:
- Zapisujesz oba obrazki np image1.bmp image2.bmp
- Obliczasz sume kontrolna (CRC32) image1.bmp i image2.bmp
- Sprawdasz czy CRC sa takie same
- 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 :)
Ale jeden obrazek moze byc przesuniety 2 pixele w prawo, i dupa.
Kiedys byl temat o porownywaniu stringow, poszukaj [diabel]
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.
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?
co Ci nie działa ??
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.
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 [???]
Problem rozwiązany ale czasami gdy porównuje obrazki pojawia się błąd "Scan Line Index out of range", co jest jego przyczyną??