2012-03-12 14 views
6

में पिक्सेल के आरजीबी/आरजीबीए मान को प्राप्त करना और सेट करना मुझे इसकी आवश्यकता क्यों है?एक CCSprite (cocos2d-x)

असल में मुझे रंगीन छवि को ग्रे-स्केल में बदलने की आवश्यकता है। छवि का एक ग्रे-स्केल संस्करण भी एक समाधान हो सकता है, लेकिन मेरी स्थिति में जगह कसकर है - मैं नहीं चाहता कि मेरा एपीके बहुत बड़ा हो। इसके अलावा, मैं कुछ प्रभावों के लिए पिक्सल पर भी काम करना चाहता हूं। फिर, यह एपीके छोटा बनाना है।

मुझे getPixel setPixel from CCTexture2D और Getting image's pixel RGBA मिला है, लेकिन मुझे कुछ और आसान चाहिए।

किसी भी मदद की सराहना की जाती है।

धन्यवाद!

उत्तर

7

यहाँ आप के लिए मेरी समाधान है:

CCImage *img= new CCImage(); 
img->initWithImageFile("colors.png"); 

द्वितीय) स्प्राइट से:

  • II.1) CCSprite -> RenderTexture2D

  • II.2) RenderTexture2D -> CCImage (CCImage *testImage = RenderText2D->newCCImage();)

2.Then आप क्या कर सकते हैं कि तुम क्या जरूरत है:

CCImage *img= ... // make CCImage from CCSprite 
    int x=3; 
    if(img->hasAlpha()) 
     x=4; 

    unsigned char *data = new unsigned char[img->getDataLen()*x]; 
    data = img->getData(); 
    // [0][0] => Left-Top Pixel ! 
    // But cocos2d Location Y-axis is Bottom(0) to Top(max) 

    for(int i=0;i<img->getWidth();i++) 
    { 
     for(int j=0;j<img->getHeight();j++) 
     { 
      unsigned char *pixel = data + (i + j * img->getWidth()) * x; 

      // You can see/change pixels' RGBA value(0-255) here ! 
      unsigned char r = *pixel; 
      unsigned char g = *(pixel + 1); 
      unsigned char b = *(pixel + 2) ; 
      unsigned char a = *(pixel + 3); 
     } 
    } 

3. फिर, इसे texture_2D

//CCImage -> Texture2d 
    texture_2D= new CCTexture2D(); 
    texture_2D->initWithImage(img); 
पर परिवर्तित करें

4.And अंत में वापस CCSprite

CCSprite *result= CCSprite::createWithTexture(texture_2D); 
+0

मैं समझता हूं कि आप rgba मान कैसे देख सकते हैं, क्योंकि आप char r = * पिक्सेल सेट कर रहे हैं। लेकिन आप पिक्सेल के मूल्य को कैसे बदलते हैं? मैं पॉइंटर्स के साथ क्या कर रहा हूं इसके बारे में थोड़ा उलझन में हूं। क्या तुम समझा सकते हो ? –

+1

@ जॉन निश्चित। यह लगभग समान है। जैसा कि आप समझते हैं, हम '* पिक्सेल' सूचक का उपयोग करके प्रत्येक पिक्सेल के 'आर' मान तक पहुंच सकते हैं। यह एक पढ़ें ('xxx = * पिक्सेल') है और लिखें (' * पिक्सेल = xxx') पहुंच। ('जी' के लिए '* (पिक्सेल + 1) 'का उपयोग करें और इसी तरह) – Emadpres

+0

क्या आप * डेटा = नया हस्ताक्षर किए बिना स्मृति को लीक नहीं कर रहे हैं ..... और फिर अगली पंक्ति में डेटा = img-> getData()? –

0

यह कुछ तरीकों से किया जा सकता है। मैंने अतीत में जो किया है वह केवल स्पोर्ट पर सेटकॉलर को जिसे आप ढूंढ रहे हैं उसके करीब कुछ रंग के लिए कहा जाता है। उसने मेरे उद्देश्यों के लिए काम किया था।

my_sprite.setColor (सीसीसी 3 (128, 128, 128));

एक अन्य समाधान (अधिक व्यापक और सटीक): फ़ाइल से

मैं):

1.First आपकी छवि के CCImage संस्करण बनाने: how to implement grayscale rendering in OpenGL?

+0

को मैं setColor() पता है, लेकिन है कि नहीं है कि मैं क्या चाहता हूँ। आपके लिंक के लिए धन्यवाद! –

संबंधित मुद्दे