java "और 0xff" क्या करता है?




bufferedimage (4)

रंग प्रतिनिधित्व

RGB मान एक पूर्णांक है इसलिए इसे 4 बाइट्स (या समतुल्य 32 बिट्स) द्वारा मेमोरी में दर्शाया जाता है।

उदाहरण:

00000001 00000010 00000011 00000100

प्रत्येक बाइट रंग के एक घटक का प्रतिनिधित्व करता है:

  • पहली बाइट: अल्फा वैल्यू (उदाहरण में 00000001) जो अपारदर्शिता से मेल खाती है
  • दूसरा बाइट: लाल मूल्य (उदाहरण में 00000010)
  • 3 बाइट: हरा मूल्य (उदाहरण में 00000011)
  • 4 बाइट: नीला मूल्य (उदाहरण में 00000100)

0xff और 0xffff प्रतीक

0xff हेक्साडेसिमल मान FF का प्रतिनिधित्व करता है जो पूर्णांक 255 के बराबर है। इसका द्विआधारी प्रतिनिधित्व है:

00000000 00000000 00000000 11111111

इसी तरह से 0xffff का प्रतिनिधित्व किया जाता है:

00000000 11111111 11111111 11111111

यह रंग सफेद (लाल, हरा और 255 के बराबर नीला) से मेल खाता है।

& ऑपरेटर

बाइनरी ऑपरेटर और "और" दो पूर्णांक i1 और i2 (i1 & i2) पर लागू होता है। यह अपने सभी बिट्स के साथ एक पूर्णांक देता है जो 0 के बराबर है जो कि i1 और i2 दोनों में 1 के बराबर है। उदाहरण के लिए, यदि हम लागू करते हैं और मेरे पहले उदाहरण पर और 0xff पर, हम प्राप्त करते हैं:

00000000 00000000 00000000 00000100

परिणामस्वरूप, (और 0xff) केवल अंतिम बाइट (यानी, रंग के नीले घटक का मूल्य) के मूल्यों को बनाए रखने में सक्षम बनाता है।

// If the blue component of image.getRGB(i, j) is greater than b
if ((image.getRGB(i, j) & 0xff) > b) {
    // Set the image to white
    image.setRGB(i, j, 0xffffff) ;
} else {
    // Set the image to black
    image.setRGB(i, j, 0x000000);
}

मैं नीचे दिए गए कोड को समझने की कोशिश कर रहा हूं जहां b एक पूर्णांक है और image एक छवि है।

मैं समझता हूं कि अगर दिए गए बिंदु पर आरजीबी का मूल्य i, j, b से अधिक है तो उस पिक्सेल को सफेद से दूसरे पर सेट करें। इसलिए छवि को काले और सफेद में परिवर्तित किया जाएगा।

हालाँकि मैं वास्तव में क्या करता हूं (और 0xff) से हार जाता हूं, मैं इसकी एक तरह की बाइनरी शिफ्ट का अनुमान लगा रहा हूं?

if ((image.getRGB(i, j) & 0xff) > b) {
    image.setRGB(i, j, 0xffffff) ;
} else {
    image.setRGB(i, j, 0x000000);
}

यह एक तथाकथित मुखौटा है। बात यह है कि, आपको एक घटक में सभी घटक के लिए एक बाइट के साथ आरजीबी मूल्य मिलता है। 0xAARRGGBB (अल्फा, रेड, ग्रीन, ब्लू) जैसा कुछ। एक बिटवाइज़-और 0xFF के साथ प्रदर्शन करके, आप केवल अंतिम भाग रखते हैं, जो नीला है। अन्य चैनलों के लिए, आप उपयोग करेंगे:

int alpha = (rgb >>> 24) & 0xFF;
int red   = (rgb >>> 16) & 0xFF;
int green = (rgb >>>  8) & 0xFF;
int blue  = (rgb >>>  0) & 0xFF;

अल्फा मामले में, आप इसे छोड़ सकते हैं & 0xFF , क्योंकि यह कुछ भी नहीं करता है; नीले मामले में 0 से शिफ्टिंग के लिए भी।



& 0xff एक बिटवाइज़ है और है

(image.getRGB(i,j)&0xff) आरजीबी एनकोडेड int का नीला मान getRGB द्वारा लौटा दिया getRGB है > b भाग की जाँच करें कि क्या यह कुछ सीमा से अधिक है





bufferedimage