2012-03-12 7 views
6

Зачем мне это нужно?Получение и установка значения RGB/RGBA пикселя в CCSprite (cocos2d-x)

В принципе, мне нужно превратить цветное изображение в серое. Включение серой версии изображения может быть решением, но в моей ситуации нет места - я не хочу, чтобы мой APK был слишком большим. Кроме того, я хотел бы работать с пикселями для некоторых эффектов. Опять же, это должно сделать APK меньше.

Я нашел getPixel setPixel from CCTexture2D и Getting image's pixel RGBA, но мне хотелось бы что-то более простое.

Любая помощь приветствуется.

Спасибо!

ответ

7

Вот мое решение для вас:

1.First сделать версию CCImage вашего изображения:

I) из файла:

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

II) Из Sprite:

  • 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.Then, преобразовать его в 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 = * pixel. Но как вы меняете значение пикселя? Я немного смущен тем, что вы делаете с указателями. Вы можете объяснить ? –

+1

@John Конечно. Это почти похоже. Как вы поняли, мы могли получить доступ к значению «R» каждого пикселя с помощью указателя '* pixel'. Это доступ для чтения ('xxx = * pixel') и Write (' * pixel = xxx'). (используйте '* (pixel + 1)' для 'G' и т. д.) – Emadpres

+0

Вы не просачиваете память, делая * data = new unsigned ....., а затем в следующей строке делаем data = img-> getData()? –

0

Это можно сделать несколькими способами. То, что я делал в прошлом, - это просто назвать setColor на спрайте с некоторым цветом, близким к тому, что вы ищете. Это сработало для моих целей.

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

Другое решение (более полно и точно): how to implement grayscale rendering in OpenGL?

+0

Я знаю SetColor(), но это не то, что я хочу. Спасибо за вашу ссылку! –