2012-10-31 14 views
5

私は問題がいくつかのイメージが、それは正確ではないので、それは目立たないが、クロップアップネジだように白いの近くにある時折浮遊ピクセルを持っているPHP:「白く近く」を色で表現する方法は?

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

のようなものを作品の画像の周りに白い部分をトリミングする機能を持っています0xFFFFFFだが0xFFFEFFか何か。上記の文を書き直して、白い画像に近いもの、つまり0xFDFDFDまで真実を評価し、明らかに可能な値をテストすることなく、明らかにすることができます。

+0

手動でグループワイズレンジの比較を行う必要があります。 –

答えて

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 
} 

、お読みください:

+0

これは私のためには機能しません。今でも完全に白い画像を切り取ることはありません。 – L84

+0

@ L84:おそらく '> ='の代わりに '<'が必要なためです。コードをコピーして貼り付けるだけでなく、それを理解しようとする。理解の問題がある場合は、コメントにお尋ねください。この回答には何が行われているかの説明は含まれていないので、あなたのためにいくつかの「仕事」があります。 – hakre

+0

私はできるだけ早くそれをテストして答えを受け入れ、何の理由もなく質問を開いていないようにしていました。 :) – L84

0

私は、これは仕事をすべきだと思う:使用される演算子の説明については

$range = 0xFFFFFF - 0xFFFEFF; 

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

残念ながら、画像の中央にオーバーフローするだけです。 – L84

2

をこれらをオフに検出するには白の色は正しくRGB色座標からに変換する必要があります; HSVでは、すべてのオフホワイトはSが0に近く、Vが100に近い(正規化されている)。あなたは「そのコードとdのようThis questionは、変換を行うためにPHPコードと答えています:

$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 
} 

あなたはリラックスしたり、好きなように基準を厳しくする定数.05.95を微調整することができます。インタラクティブカラーピッカー(例:this)を使用して、SVという異なる値の色がどれくらい近くに近いかを感じることができます。

+0

RGB_TO_HSV()は3つの引数を必要とし、これは1つだけを渡します。 – L84

+0

@ L84:修正のために編集されましたが、ちょっと変わっています。 – Jon

0

これはこれを行う方法の1つです。色をRGBコンポーネントに分割して、$color = 0xFFFEEFとすると、$red = 0xff; $green = 0xfeになります。 $ blue = 0xef 'です。次に、各コンポーネントをしきい値と比較します。 3つがすべてあなたのしきい値以内ならば、それは「ほぼ白い」です。つまり、あなたの関数は(擬似コード)のようになります。

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

RGBの整数に "and"を適用すると、ほぼ白を検出できます。基本的には、Alin Romanが言ったのと同じことですが、もう少し簡単です。

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

0xFFFFFFから0xF0F0F0までの色を検出する必要があります。

関連する問題