Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#33

AW: Durchschnittsfarbe eines Bitmap "schnell" ermitteln

  Alt 11. Mai 2021, 20:28
@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).
Michael Gasser
  Mit Zitat antworten Zitat