![]() |
Re: Gleiche Listboxeinträge zählen
Und wenn man mal wirklich drüber nachdenkt, geht das extrem viel schneller, und extrem viel eleganter:
Delphi-Quellcode:
Ist halt nen 16MB Array, und sollte daher nach Möglichkeit keine lokale Variable sein (hier nur für'n Zusammenhang so), aber was sind heutzutage schon 16MB ;). Zum Schluss einfach die Arraywerte in die Listbox werfen, ich würd dabei aber alle die =0 sind weg lassen.
type
TRGBTriple = packed record b: byte; g: byte; r: byte; end; PRGBTriple = ^TRGBTriple; . . var hist: array[16777216] of Cardinal; p: PRGBTriple; x, y: Integer; begin Bitmap.PixelFormat := pf24Bit; for y := 0 to Bitmap.Height do begin p := Bitmap.Scanline(y); for x := 0 to Bitmap.Width do begin inc(hist[(p^.r shl 16) or (p^.g shl 8) or p^.b]); inc(p); end; end; end; Sowas nennt sich übrigens "Histogramm", daher "hist[]". Normalerweise erstellt man diese für jeden Farbkanal getrennt, was dann auch nur noch 3 Arrays á 256 Zähler sind. Das da oben ist völlig ungetestet und hier in der DP geschribselt. Keine Garantie auf Kompilierbarkeit ;) Edit: Und um das Monster-Array kommt man herum, wenn man statt dessen eine hübsche Liste bemüht, in die Farbwerte erst eingetragen werden, sobald sie vorkommen. Macht aber das nette direkt addressierte Inkrementieren kaputt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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