2012-10-31 64 views
5

मैं उस तरहPHP: रंग के रूप में "सफेद के करीब" कैसे व्यक्त करें?

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

कुछ समस्या है क्योंकि यह वास्तव में नहीं है कुछ छवियों एक सामयिक आवारा पिक्सेल सफेद है कि यह unnoticeable है, लेकिन शिकंजा अप फसल के पास इतना है कि राशि है काम करता है चित्र के चारों ओर सफेद क्षेत्रों ट्रिमिंग के लिए एक समारोह है 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

@ एल 84: शायद क्योंकि आपको '>' '' '' 'की बजाय' <'की आवश्यकता है। न केवल कोड कॉपी और पेस्ट करें बल्कि इसे समझने का प्रयास करें। यदि आपके पास समझदारी की समस्या है, तो टिप्पणियों में पूछें। इस उत्तर में क्या किया गया है, इसमें बहुत अधिक विवरण नहीं है, इसलिए आपके लिए कुछ "काम" बाकी है। – hakre

+0

मैं इसे जितनी जल्दी हो सके परीक्षण करने की कोशिश कर रहा था ताकि एक उत्तर स्वीकार किया जा सके और किसी कारण से प्रश्न खुला न हो। :) – L84

0

मुझे लगता है कि यह काम करना चाहिए:

$range = 0xFFFFFF - 0xFFFEFF; 

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

दुर्भाग्यवश काम नहीं करता है, यह छवि – L84

2

इन बंद पता लगाने के लिए -विइट रंग सही ढंग से आपको आरजीबी रंग निर्देशांक सेमें परिवर्तित करना चाहिए; एचएसवी में, सभी ऑफ-व्हाइट में एस 0 के पास होता है और 100 (सामान्यीकृत) के पास एक वी होता है। This question, रूपांतरण करने के लिए PHP कोड के साथ एक जवाब है ताकि कोड आप के साथ d है:

$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 tweak कर सकते हैं; आप S और V के विभिन्न मानों के लिए रंगों के करीब कितने करीब हैं, यह महसूस करने के लिए आप एक इंटरैक्टिव कलर पिकर (उदा। this) का उपयोग कर सकते हैं।

+0

RGB_TO_HSV() को 3 तर्कों की आवश्यकता है और यह केवल एक ही गुजरता है। – L84

+0

@ L84: ठीक करने के लिए संपादित, लेकिन यह बस थोड़ा सा twiddling है। – Jon

0

ऐसा करने का एक तरीका यहां है। अपने रंग को अपने आरजीबी घटक में विभाजित करें, ताकि $color = 0xFFFEEF के साथ आप $red = 0xff; $green = 0xfe के साथ समाप्त हो जाएंगे; $ नीला = 0xef '। फिर प्रत्येक घटक की तुलना अपने थ्रेसहोल्ड पर करें। यदि सभी तीन आपके दहलीज के भीतर हैं, तो यह "लगभग-सफेद" है।

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

आप एक "और" आरजीबी पूर्णांक तक लगाने से लगभग सफेद पता लगा सकते हैं: तो अपने समारोह (छद्म कोड) की तरह कुछ होगा। असल में यह वही बात है जो एलिन रोमन ने कहा लेकिन थोड़ी सी सरल, एक पंक्ति।

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

इसे 0xFFFFFF से 0xF0F0F0 तक रंगों का पता लगाना चाहिए।