Pergunta

Por que eu preciso disso?

Basicamente preciso transformar uma imagem colorida em escala de cinza.Incluir uma versão em escala de cinza da imagem pode ser uma solução, mas o espaço é limitado na minha situação - não quero que meu APK seja muito grande.Além disso, gostaria de trabalhar nos pixels para alguns efeitos também.Novamente, isso torna o APK menor.

eu encontrei getPixel setPixel de CCTexture2D e Obtendo o pixel RGBA da imagem, mas eu gostaria de algo mais simples.

Qualquer ajuda é apreciada.

Obrigado!

Foi útil?

Solução

Aqui está minha solução para você:

1. Primeiro faça uma versão CCImage da sua imagem:

I) do arquivo:

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

II) De Sprite:

  • II.1) CCSprite -> RenderTexture2D

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

2.Então você pode fazer o que precisa:

    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.Em seguida, converta-o para textura_2D

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

4.E finalmente de volta ao CCSprite

CCSprite *result=  CCSprite::createWithTexture(texture_2D);

Outras dicas

Isso pode ser feito algumas maneiras.O que eu fiz no passado é apenas chamado SetColor no sprite para alguma cor perto do que você está procurando.Que funcionou para os meus propósitos.

my_sprite.setcolor (CCC3 (128, 128, 128));

Outra solução (mais completa e precisa): como implementar a prestação de cinza em OpenGL?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top