Getting and setting the RGB / RGBA value of a pixel in a CCSprite (cocos2d-x)

前端 未结 2 1545
你的背包
你的背包 2021-01-01 01:34

Why do I need this?

Basically I need to turn a color image into gray-scale. Including a gray-scale version of the image could be a solution, but space is tight in my

相关标签:
2条回答
  • 2021-01-01 02:00

    Here is my solution for you :

    1.First make a CCImage version of your image:

    I) from File :

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

    II) From Sprite :

    • II.1) CCSprite -> RenderTexture2D

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

    2.Then You can do what you need :

        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.Then, convert it to texture_2D

    //CCImage -> Texture2d
        texture_2D= new CCTexture2D();
        texture_2D->initWithImage(img);
    

    4.And Finally back to CCSprite

    CCSprite *result=  CCSprite::createWithTexture(texture_2D);
    
    0 讨论(0)
  • 2021-01-01 02:24

    This can be done a couple of ways. What I have done in the past is to just called setColor on the sprite to some color close to what you are looking for. That had worked for my purposes.

    my_sprite.setColor( ccc3( 128, 128, 128 ) );

    Another solution (more thorough and precise): how to implement grayscale rendering in OpenGL?

    0 讨论(0)
提交回复
热议问题