Получение и установка значения RGB / RGBA пикселя в CCSprite (cocos2d-x) - PullRequest
6 голосов
/ 12 марта 2012

Зачем мне это нужно?

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

Я нашел getPixel setPixel из CCTexture2D и Получение пикселя изображения RGBA , но я бы хотел что-то более простое.

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

Спасибо!

Ответы [ 2 ]

7 голосов
/ 22 августа 2013

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

1. Сначала сделайте 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. Затем вы можете делать то, что вам нужно:

    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. И, наконец, вернемся к CCSprite

CCSprite *result=  CCSprite::createWithTexture(texture_2D);
0 голосов
/ 13 марта 2012

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

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

Другое решение (более точное и точное): как реализовать рендеринг в оттенках серогов OpenGL?

...