![]() |
Toleranzen von Farben
Hallo und guten Morgen an alle DP´ler,
Heute mal ein ganz anderes Thema, nicht immer nur Komponenten :roll: Also ich zeichne und schreibe auf ein TBitmap mit der Farbe csBlack. Nun wollte ich zurücklesen, wieviele der Pixel in diesem TBitmap nach dem Zeichnen und Beschriften die Farbe csBlack erhalten haben. Leider stoße ich dort auf ein paar Wiedrigkeiten. Gerade bei dem Schriftteil gehen sehr viele Pixel bei der Zählung verloren, da anscheinend eine Fluktuation in den Farben der einzelnen Pixeln vorliegt. Jetzt habe ich mehrfach zu solchen ähnlichen Themen gelesen, dass DeddyH auf Toleranzen hinweißt, die man dort beim auslesen setzen könnte, leider noch keinen Beitrag gefunden, wo dies mal umgesetzt wurde. Hat jemand vieleicht ein Beispiel, dass mit Farbtoleranzen arbeitet oder kennt jemand ein Beispiel, wo man sieht, wie man das machen kann? Vielen Dank BAMatze |
Re: Toleranzen von Farben
Kann es sein, dass du ClearType aktiviert hast? Das würde dieses Verhalten erklären.
Dust Signs |
Re: Toleranzen von Farben
Zitat:
|
Re: Toleranzen von Farben
Eine TColor wie clBlack besteht aus 4 Byte (jeweils eins für rot, grün, blau und ein Merkmal für Systemfarben). clBlack ist AFAIK $00000000. Wenn nun beispielsweise der Rotanteil auch nur geringfügig höher ist ($00000001), greift Dein Vergleich nicht mehr. Du könntest nun also die Farbe in ihre Bestandteile zerlegen (GetRValue, GetGValue, GetBValue) und mit einfacher Prozentrechnung ermitteln, ob sich der jeweilige Anteil innerhalb einer von Dir definierten Toleranz (z.B. 5 %) befindet.
|
Re: Toleranzen von Farben
ClearType kannst du in der Systemsteuerung deaktivieren, indem du die Kantenglättung bei Schriften auf "deaktiviert" stellst. Mehr Informationen zu ClearType findest du z.B.
![]() Dust Signs |
Re: Toleranzen von Farben
Zitat:
![]()
Delphi-Quellcode:
die Unterschiede der Farben einzugehen. Ich hab mir dazu mal ein kleines Programm geschrieben und es an einem einzigen Buchstaben getestet und das geht total in die Hose. Bis zu einem Unterschied von 2 gibt er immer das gleiche aus (natürlich das falsche) und bei 1 gibt er was anderes aus (aber auch flasch). Kann natürlich immer noch sein, dass ich da was flasch verstanden habe. Das nurmal als Einwurf.
if abs(bm1.canvas.pixels[i,j] - bm2.canvas.pixels[i,j]) < 20 then
Jetzt zu GetRValue, ... :-D |
Re: Toleranzen von Farben
Moin,
in dem letzten Beispiel wird der Farbunterschied von Pixeln identischer Koordinate in zwei verschiedenen Bitmaps ausgewertet. In deinem Fall geht es doch aber wohl um die Abweichung von einem Sollwert, oder? |
Re: Toleranzen von Farben
Zitat:
Allerdings muss ich jetzt auch sagen, ich versuche ein sehr kleinen Buchstaben zu "scannen". |
Re: Toleranzen von Farben
Ich habe mal schnell eine Funktion geschrieben (für Fehlerfreiheit und Performance übernehme ich allerdings kein Garantie):
Delphi-Quellcode:
In kurzen Tests sah das ganz gut aus, aber ich kann mich auch irgendwo verrechnet haben.
function SimilarColors(FirstColor, SecondColor: TColor;
Percentage: byte = 5): Boolean; function ColorInRange(first, second: byte): Boolean; begin Result := abs(first - second) <= Round(MAXBYTE / 100 * Percentage); end; var R1,R2,G1,G2,B1,B2: byte; begin R1 := GetRValue(FirstColor); R2 := GetRValue(SecondColor); G1 := GetGValue(FirstColor); G2 := GetGValue(SecondColor); B1 := GetBValue(FirstColor); B2 := GetBValue(SecondColor); Result := ColorInRange(R1,R2) and ColorInRange(G1,G2) and ColorInRange(B1,B2); end; |
Re: Toleranzen von Farben
Zitat:
das ist logisch, wenn richtig gerendert wurde. Am Rand (des Buchstabens z.B.) wird nämlich die Farbe proportional zur belegten Pixelfläche interpoliert zwischen Buchstabenfarbe und Hintergrund. Gehört z.B. die Häfte des Pixels zu einem schwarzen Buchstaben auf weissem Grund, so erhält das Pixel ein 50% grau. Das heisst EBEN NICHT, dass es sich um ein graues Pixel handelt, sondern dass an diese Stelle eigentlich ein halbes weisses und ein halbes schwarzes Pixel gehört. Daraus ist zu entnehmen, dass die Abweichung beliebig gross sein kann, im Beispiel 50%, und dass das auch völlig korrekt ist. Gruss Reinhard Nachtrag: a das Ergebnis hängt also auch vom Hintergrund ab. b um etwa einen Buchstaben zu löschen, müsste man alle Pixel zurücksetzen, die sich vom Hintergrund unterscheiden, auch wenn sie im Beispiel nur 10% grau sind - sonst bleibt ein grauer Schatten übrig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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 by Thomas Breitkreuz