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

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

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

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

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

Спасибо!


person Siu Ching Pong -Asuka Kenji-    schedule 12.03.2012    source источник


Ответы (2)


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

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);
person Emadpres    schedule 22.08.2013
comment
Я понимаю, как вы можете увидеть значения rgba, поскольку вы устанавливаете char r = * pixel. Но как изменить значение пикселя? Я немного запутался в том, что вы делаете с указателями. Вы можете объяснить ? - person Rahul Iyer; 05.10.2016
comment
@ Джон Конечно. Это почти похоже. Как вы поняли, мы можем получить доступ к R значению каждого пикселя с помощью указателя *pixel. Это доступ для чтения (xxx=*pixel) и записи (*pixel=xxx). (используйте *(pixel+1) вместо G и так далее) - person Emadpres; 05.10.2016
comment
Разве вы не теряете память, выполняя * data = new unsigned ....., а затем в следующей строке выполняя data = img- ›getData ()? - person Rahul Iyer; 11.10.2016
comment
@John Для использования getData() вам необходимо заранее выделить некоторую память. В любом случае вы правы ... вам, конечно, нужно освободить data память в конце процедуры: delete data. - person Emadpres; 12.10.2016
comment
ха-ха ... на самом деле я задал кому-то еще вопрос об этом, и они сказали мне, что я теряю данные, основанные на выполнении нового, а затем следующая строка, как я уже упоминал ... Я делаю удаление, но я не выделял. .. прямо сейчас я просто назначаю сразу (не выделяю), потому что это еще не выделено img? Я чувствую себя полотенцем ... понятия не имею, что происходит ... .XD - person Rahul Iyer; 12.10.2016
comment
@ Джон Ну. Я написал код много лет назад и за это время обнаружил, что мне нужно выделить память. Но Cocos2dx улучшается месяц за месяцем, и они, возможно, изменили поведение getData(). В любом случае, сейчас я не могу его протестировать, проверьте, нужно это или нет. - person Emadpres; 13.10.2016

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

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

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

person irwinb    schedule 13.03.2012
comment
Я знаю setColor (), но мне это не нужно. Спасибо за ссылку! - person Siu Ching Pong -Asuka Kenji-; 13.03.2012