Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Toleranzen von Farben (https://www.delphipraxis.net/134030-toleranzen-von-farben.html)

BAMatze 14. Mai 2009 09:40


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

Dust Signs 14. Mai 2009 09:44

Re: Toleranzen von Farben
 
Kann es sein, dass du ClearType aktiviert hast? Das würde dieses Verhalten erklären.

Dust Signs

BAMatze 14. Mai 2009 09:49

Re: Toleranzen von Farben
 
Zitat:

Zitat von Dust Signs
Kann es sein, dass du ClearType aktiviert hast? Das würde dieses Verhalten erklären.

Hmm das sagt mir gerade nichts, wo könnte ich das denn ausstellen, wenn ich es wollte? In der Hilfe hab ich nur was über Rendering gelesen dazu aber aktiv dies eingeschaltet, habe ich glaube nicht.

DeddyH 14. Mai 2009 09:51

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.

Dust Signs 14. Mai 2009 09:53

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. hier

Dust Signs

BAMatze 14. Mai 2009 09:58

Re: Toleranzen von Farben
 
Zitat:

Zitat von DeddyH
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.

Das hört sich schonmal sehr gut an. Werde ich gleich mal versuchen einzubauen. Folgendes habe ich auch gefunden auch dieser Seite. Ähm ja anscheinend versucht er ja auch mit
Delphi-Quellcode:
if abs(bm1.canvas.pixels[i,j] - bm2.canvas.pixels[i,j]) < 20 then
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.

Jetzt zu GetRValue, ... :-D

taaktaak 14. Mai 2009 10:18

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?

BAMatze 14. Mai 2009 10:28

Re: Toleranzen von Farben
 
Zitat:

Zitat von taaktaak
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?

Ja richtig. Hab dazu auch mal schnell ein kleines Testprogramm geschrieben. Allerdings ist das Ergebnis schon etwas überraschend. Also obwohl ich ihm eigentlich anweise mit der Farbe clBlack zu schreiben, weichen die meisten Pixelwerte sehr stark vom RGB-Wert (0,0,0) ab. Teilweise sind diese Abweichungen > als 100 Farbstufen in einem der RGB-Bereiche.

Allerdings muss ich jetzt auch sagen, ich versuche ein sehr kleinen Buchstaben zu "scannen".

DeddyH 14. Mai 2009 10:35

Re: Toleranzen von Farben
 
Ich habe mal schnell eine Funktion geschrieben (für Fehlerfreiheit und Performance übernehme ich allerdings kein Garantie):
Delphi-Quellcode:
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;
In kurzen Tests sah das ganz gut aus, aber ich kann mich auch irgendwo verrechnet haben.

Reinhard Kern 14. Mai 2009 11:09

Re: Toleranzen von Farben
 
Zitat:

Zitat von BAMatze
... Also obwohl ich ihm eigentlich anweise mit der Farbe clBlack zu schreiben, weichen die meisten Pixelwerte sehr stark vom RGB-Wert (0,0,0) ab. Teilweise sind diese Abweichungen > als 100 Farbstufen in einem der RGB-Bereiche.
.

Hallo,

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 03:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz