![]() |
Image und ImageList vergleichen
Hallo
Ich versuche ein Image, was ich zuvor aus ImageList1 geholt habe, mit dem gleichen Picture aus der ImageList1 zu vergleichen. Mein Versuch:
Delphi-Quellcode:
Leider funktioniert dies nicht.
if Image1.Picture.Bitmap = ImageList1.GetBitmap(0,Image1.Picture.Bitmap)
then Geg1.Caption := 'Hallo'; |
Re: Image und ImageList vergleichen
Ich würde die Bilder durch setzten des .Tag eindeutig zuordenbar machen.
|
Re: Image und ImageList vergleichen
Es ist ganz einfach, du musst im ersten Parameter die Zeillennummer in der das Bild ist auswählen!
Delphi-Quellcode:
if Grafik.Picture.Bitmap = ImgList.GetBitmap({Hier die Zeilennummer},Grafik.Picture.Bitmap) then TxtFeld.Caption := 'Hallo';
|
Re: Image und ImageList vergleichen
ich glaube nicht, dass das ein "richtiger" Bitmap-Vergleich ist, da du nur 2 Referenzen vergleichst...
ich hatte mir für diesen zweck mal folge funktion geschrieben...
Delphi-Quellcode:
Gruß Frank
function CompareBitmaps(Bmp1,Bmp2:TBitmap):boolean;
type PRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = array[0..32767] of TRGBTriple; var srcRow, DestRow: PRGBTripleArray; x,y:integer; different:boolean; begin different:=false; if (bmp1.width=bmp2.width) and (bmp1.height=bmp2.height) then begin y:=0; while (y < bmp1.Height) and (different=false) do begin SrcRow := Bmp1.Scanline[y]; DestRow := Bmp2.Scanline[y]; x:=0; while (x < Bmp1.Width) and (different=false) do begin if not ((SrcRow[x].rgbtRed=DestRow[x].rgbtRed) and (SrcRow[x].rgbtGreen=DestRow[x].rgbtGreen) and (SrcRow[x].rgbtBlue=DestRow[x].rgbtBlue)) then different:=true; inc(x); end; inc(y); end; end else different:=true; Result:=not different; end; |
Re: Image und ImageList vergleichen
hat jemand noch eine andere lösung? die gegebenen funktionieren entweder nicht (Antwort 1 und 2) oder ich will sie nicht nutzen, weil ich sie nicht verstehe (Antwort 3).
Geg1 ist übrigens eine GroupBox. |
Re: Image und ImageList vergleichen
Warum soll das mit dem .Tag nicht funktionieren? Du Mußst nur beim herausholen des Bildes z.B. den Index des Bildes in den .Tag des TImage schreiben. das ist auf jeden Fall weniger aufwendig, als die beiden Bilder anhand des Inhalts zu vergleichen.
|
Re: Image und ImageList vergleichen
Wie wärs damit:
Delphi-Quellcode:
(Ungetestet)
function BitmapsEqual(bmp1, bmp2: TBitmap): Boolean;
var I, J: Integer; begin if (bmp1 = nil) xor (bmp2 = nil) then Result:=True else Result:=False; if (bmp1 = nil) or (bmp2 = nil) then exit; if (bmp1.width <> bmp2.width) or (bmp1.height <> bmp2.height) then begin Result:=False; exit; end; Result:=False; for I:=0 to bmp1.width-1 do for J:=0 to bmp1.height-1 do if bmp1.canvas.pixels[I, J] <> bmp2.canvas.pixels[I, J] then exit; Result:=True; end; |
Re: Image und ImageList vergleichen
meine Funktion macht eigentlich das gleiche wie der schleifenteil von 3_of_8, nur dass Canvas.Pixels seeeeehhhr lahm ist, deswegen per scanline.
Scanline arbeitet (wie der Name schon sagt) zeilenweise...er liest das Bitmap zeile für zeile ein und schreib den inhalt dieser Zeile in ein mehrdimensionales array (einmal für bitmap1 (srcRow) und einmal für bitmap2 (destrow)). dieses array wird pixel für pixel durchlaufen und mit dem anderen array an gleicher position verglichen (jeder Farbkanal einzeln). mal bisschen Pseudocode zum verständnis (array, was scanline ausspuckt):
Delphi-Quellcode:
Hoffe es ist jetzt bisschen verständlicher geworden...
const
rgbtRed=0; rgbtGreen=1; rgbtBlue=2; type TPixel=array[rgbtRed..rgbtBlue] of byte; //die 3 Farbwerte pro Pixel TLine=array of TPixel; //alle Pixel einer zeile (SrcRow,DestRow in der Funktion) ansonsten mal die OH befragen oder wenn das nicht hilf hier ;) Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz