2012-10-31 12 views
5

Ich habe eine Funktion zum Beschneiden von weißen Flächen um Bilder, die so etwas wiePHP: wie man "nahe Weiß" als Farbe ausdrückt?

if(imagecolorat($img, $x, $top) != 0xFFFFFF) { 
    //sets where the top part of the image is trimmed 
} 

Das Problem ist, einige Bilder haben ein gelegentliches Streu Pixel arbeiten, die so in der Nähe weiß ist, dass es nicht wahrnehmbar, aber Schrauben das Zuschneidens, weil es nicht genau das, 0xFFFFFF aber 0xFFFEFF oder so. Wie könnte ich die obige Aussage so umschreiben, dass sie für diejenigen in der Nähe von weißen Bildern, sagen wir bis zu 0xFDFDFD, wahr ist, offensichtlich ohne für irgendeinen möglichen Wert zu testen.

+0

Manuell müssen Sie einen Gruppenvergleich durchführen. –

Antwort

6
$color = imagecolorat($img, $x, $top); 
$color = array(
    'red' => ($color >> 16) & 0xFF, 
    'green' => ($color >> 8) & 0xFF, 
    'blue' => ($color >> 0) & 0xFF, 
); 
if ($color['red'] >= 0xFD 
&& $color['green'] >= 0xFD 
&& $color['blue'] >= 0xFD) { 
    //sets where the top part of the image is trimmed 
} 

Eine Beschreibung der verwendeten Operatoren, lesen Sie bitte:

+0

Dies funktioniert nicht für mich. Es wird nicht einmal vollständig weiße Bilder zuschneiden. – L84

+0

@ L84: Wahrscheinlich, weil Sie '<' anstelle von '> =' brauchen. Kopieren und fügen Sie den Code nicht nur ein, sondern versuchen Sie ihn zu verstehen. Wenn Sie ein Verständnisproblem haben, fragen Sie in Kommentaren. Diese Antwort enthält nicht viel Beschreibung, was getan wurde, also gibt es etwas "Arbeit" für dich übrig. – hakre

+0

Ich habe versucht, es so schnell wie möglich zu testen, um eine Antwort zu akzeptieren und die Frage nicht ohne Grund offen zu haben. :) – L84

0

ich denke, das die Arbeit machen sollte:

$range = 0xFFFFFF - 0xFFFEFF; 

if((0xFFFEFF - imagecolorat($img, $x, $top)) < $range){ 
    // do 
} 
+0

Funktioniert leider nicht, es überspringt nur in der Mitte des Bildes – L84

2

Um diese zu erkennen off -White Farben korrekt sollten Sie von RGB-Farbkoordinaten zukonvertieren; bei HSV haben alle nicht-weißen ein S nahe 0 und ein V nahe 100 (normalisiert). This question hat eine Antwort mit PHP-Code um die Konvertierung zu tun, also mit diesem Code Sie d‘haben:

$rgb = imagecolorat($img, $x, $top); 
$hsv = RBG_TO_HSV(($rgb >> 16) & 0xFF, ($rgb >> 8) & 0xFF, $rgb & 0xFF); 
if ($hsv['S'] < .05 && $hsv['V'] > .95) { 
    // color is off-white 
} 

Sie können die Konstanten zwicken .05 und .95, um die Kriterien zu lockern oder verschärfen, wie Sie möchten; Sie können auch einen interaktiven Farbwähler (z. B. this) verwenden, um ein Gefühl dafür zu bekommen, wie nahe Weiß die Farben für unterschiedliche Werte von S und V sind.

+0

RGB_TO_HSV() benötigt 3 Argumente, und dies gibt nur einen aus. – L84

+0

@ L84: Bearbeitet, um zu beheben, aber es ist nur ein bisschen drehen. – Jon

0

Hier ist eine Möglichkeit, dies zu tun. Teilen Sie Ihre Farbe in ihre RGB-Komponente, so dass Sie mit $color = 0xFFFEEF mit $red = 0xff; $green = 0xfe; $ blau = 0xef '. Dann vergleichen Sie jede Komponente mit Ihrem Schwellenwert. Wenn alle drei innerhalb Ihrer Schwelle sind, dann ist es "fast-weiß". So würde Ihre Funktion so etwas wie (Pseudo-Code) sein:

function is_nearly_white($r, $g, $b) { 
    $threshold = 0xfd; 
    return ($r > $threshold && $g > $threshold && $b > $threshold); 
} 
0

Sie können fast weiß erkennen, indem eine „und“ die RGB ganze Zahl. Im Grunde ist es dasselbe, was Alin Roman gesagt hat, aber ein bisschen einfacher, eine Zeile.

if ((imagecolorat($img, $x, $top) & 0xF0F0F0) != 0xF0F0F0) { 
    //sets where the top part of the image is trimmed 
} 

Es sollte Farben von 0xFFFFFF zu 0xF0F0F0 erkennen.