Ich versuche ein bitmap in ein Timage zu laden und dann von diesem Bitmap die Durchschnittsfarbe zu berechnen. Mein Timage hat die Außmaße 20 x 20 Pixel und stretch = true. Mein Problem ist Folgendes, wenn ich die markierte Zeile nicht auskommentiere, wird mir mein Timage nicht angezeigt (visible ist immer auf true) und die function durchschnitt liefert mir (egal bei welchem bild) den selben wert : 1911716 (in RGB 164,43,29).
Mein Quelltext sieht wie folgt aus:
Die Durchschnittsfarbfunction:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| function tmain.durchschnitt:integer; var r,g,b:int64; I,J,d:integer; c:tcolor; begin r:=0; g:=0; b:=0;
for I:=0 to imeinlesen.width-1 do for j:=0 to imeinlesen.height-1 do begin c:=imeinlesen.picture.Bitmap.canvas.Pixels[I,J]; r:=r+GetRValue(d); g:=g+GetGValue(d); b:=b+GetBValue(d); end;
D:=imeinlesen.width *imeinlesen.Height; r:=round(r/d); g:=round(g/d); b:=round(b/d);
c:=rgb2tcolor(r,g,b); result:=c;
end; |
Die function rgb2tcolor hab ich aus diesem thread
www.delphi-forum.de/...highlight=rgb2tcolor
Delphi-Quelltext
1: 2: 3: 4:
| function tmain.RGB2TColor(r,g,b : byte):TColor; begin result := r + (g shl 8) + (b shl 16); end; |
Und der eigentliche Aufruf davon findet in einem Button statt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure Tmain.Button1Click(Sender: TObject); begin if openpicturedialog.execute then begin imeinlesen.Picture.LoadFromFile(openpicturedialog.filename); showmessage(inttostr(durchschnitt)); end; end; |
Ich weiß echt nicht woran das liegt, die functionen scheinen zu stimmen, wenn ich durchschnitt mit TImages aufrufe, in denen zur Programmierzeit Bilder geladen werden, scheint das wunderbar zu klappen. Setz ich vor die markeirte Zeile ein application.processmessages oder ein imeinlesen.repaint dann seh ich zwar das Timage, aber die Werte von Durchschnitt bleiben falsch.