Ottenere e impostare il valore RGB / RGBA di un pixel in un ccsprite (cocos2d-x)
Domanda
Perché ho bisogno di questo?
Fondamentalmente ho bisogno di trasformare un'immagine a colori in scala di grigi.Compresa una versione in scala di grigi dell'immagine potrebbe essere una soluzione, ma lo spazio è stretto nella mia situazione - non voglio che il mio apk sia troppo grande.Inoltre, vorrei lavorare anche sui pixel per alcuni effetti.Di nuovo, questo è quello di rendere l'apk più piccolo.
Ho trovato getpixel setpixel da cctxture2d e Ottieni il pixel dell'immagine RGBA , ma vorrei qualcosa di più semplice.
Qualsiasi aiuto è apprezzato.
Grazie!
Soluzione
Ecco la mia soluzione per te:
1. First crea una versione di ccimage della tua immagine:
i) Dal file:
CCImage *img= new CCImage();
img->initWithImageFile("colors.png");
.
II) da Sprite:
- .
-
II.1) CCSPRITE -> RENDERTEXTURE2D
-
ii.2) RenderTexture2D -> CCIMAGE (
CCImage *testImage = RenderText2D->newCCImage();
)2. Quindi puoi fare ciò di cui hai bisogno:
.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. Quindi, convertirlo in texture_2d
.//CCImage -> Texture2d texture_2D= new CCTexture2D(); texture_2D->initWithImage(img);
4. E finalmente torna a ccsprite
.CCSprite *result= CCSprite::createWithTexture(texture_2D);
Altri suggerimenti
Questo può essere fatto un paio di modi.Quello che ho fatto in passato è solo chiamato Setcolor sullo sprite a un po 'di colore vicino a ciò che stai cercando.Che aveva funzionato per i miei scopi.
my_sprite.setColor (CCC3 (128, 128, 128));
Un'altra soluzione (più accurata e precisa): Come implementare il rendering in scala di grigi in OpenGL?