2012-03-12 123 views
6

为什么我需要这个?获取并设置CCSprite中像素的RGB/RGBA值(cocos2d-x)

基本上我需要把彩色图像变成灰度。包括图片的灰度版本可能是一个解决方案,但空间很紧张 - 我不希望我的APK太大。此外,我还想在像素上进行一些特效。再次,这是为了让APK变小。

我找到了getPixel setPixel from CCTexture2DGetting image's pixel RGBA,但我想要更简单的东西。

任何帮助表示赞赏。

谢谢!

回答

7

这是我对你的解决方案:从文件

I):

1.首先让你的图像的CCImage版本:

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

II)从雪碧:

  • II.1)CCSprite - > RenderTexture2D

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

2.然后你可以做什么,你需要:

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 = *像素。但是,你如何改变像素的价值?我对你使用指针做什么感到困惑。你可以解释吗 ? – 2016-10-05 10:59:21

+1

@John当然。它几乎相似。正如你所理解的,我们可以使用'* pixel'指针访问每个像素的'R'值。这是一个Read('xxx = * pixel')和Write('* pixel = xxx')访问。 (使用'*(像素+ 1)'为'G'等) – Emadpres 2016-10-05 15:47:07

+0

是不是通过执行* data = new unsigned .....来泄漏内存,然后在下一行执行data = img-> getData ()? – 2016-10-11 10:16:52

0

这可以通过几种方法完成。我过去所做的就是将精灵上的setColor调用到接近你要找的颜色上。这对我的目的有效。

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

另一种解决方案(更彻底,更准确): how to implement grayscale rendering in OpenGL?

+0

我知道的setColor(),但是这不是我想要的。感谢您的链接! – 2012-03-13 01:27:36