@Michael II
Nun passiert da was... aber mein Ergebniss ist falsch.
Delphi-Quellcode:
function GetAvgGDIColor(
const Filename:
string): TColor;
var
gr: TGPGraphics;
Bmap: TGPBitmap;
col: TGPColor;
begin
Result := 0;
bmap := TGPBitmap.Create(Filename);
try
gr := TGPGraphics.Create( bmap );
try
gr.ScaleTransform( 1/bmap.GetWidth, 1/bmap.GetHeight );
gr.DrawImage( bmap, 0,0 );
bmap.GetPixel(0,0, col);
Result :=
RGB(GetRValue(col), GetGValue(col), GetBValue(col));
finally
gr.Free;
end;
finally
bmap.Free;
end;
end;
Falls Du Dich nochmal reinklinken könntest
Dein Code ist fast voll ok so.
Einzig bei der Auswertung von col....
Du musst darauf achten, dass TGPColor (anders als TColor!) wie folgt die Farbe speichert:
ARGB d.h. ALPHA ROT GRÜN BLAU
Und die von dir verwendeten
Winapi.Windows TColor Funktionen GetRValue... rechnen mit (A)BGR=(ALPHA) BLAU GRÜN ROT.
Du willst ein Resultat in TColor:
Wenn du GetRValue auf col : TGPColor anwendest wirst du den Blauanteil der Farbe erhalten. Entsprechend: Wenn du GetBValue auf eine TGPColor anwendest wirst du den Rotanteil erhalten.
Testen könntest du die Sache zum Beispiel so.
Du erstellst eine hbit: TBitMap von der Grösse 500x500. Wir setzen alle Pixel auf
RGB(255,128,64). Das Pixel (0,0) auf
RGB(0,0,0).
Delphi-Quellcode:
hbit := TBitMap.Create;
hbit.SetSize( 500, 500 );
for x := 0
to hbit.Height-1
do
for y := 0
to hbit.Width-1
do
hbit.Canvas.Pixels[x,y] :=
rgb(255,128,64);
hbit.Canvas.Pixels[0,0] :=
rgb(0,0,0);
fn := '
C:\Users\micha\Desktop\test.bmp';
hbit.SaveToFile( fn );
hbit.Free;
Nun lässt du deine Funktionen auf hbit (mit anderen Farben auch prüfen!) los.
TiGü via scanline liefert - da dort nach dem Summieren div anzahlpixels (statt trunc(summe/anzahlpixels+0.5) verwendet wird - als Durchschnittsfarbe (254,127,63).
Nun lässt du die Funktion auf grizzlys
GDI+ Idee, bzw. deine Lösung los: Du erhältst wie erwartet (255,128,64).