Зачем мне это нужно?
В основном мне нужно преобразовать цветное изображение в оттенки серого. Включение серой версии изображения могло бы быть решением, но в моей ситуации места мало - я не хочу, чтобы мой APK был слишком большим. Кроме того, я бы хотел поработать над пикселями и для некоторых эффектов. Опять же, это сделано для уменьшения размера APK.
Я нашел getPixel setPixel из CCTexture2D и Получение пиксельного RGBA изображения, но мне бы хотелось чего-нибудь попроще.
Любая помощь приветствуется.
Спасибо!
Ответ 1 · рейтинг 7 · Emadpres
Вот мое решение для вас:
1. Сначала создайте версию изображения CCImage:
I) из файла:
CCImage *img= new CCImage();
img->initWithImageFile("colors.png");
II) Из Sprite:
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);
Ответ 2 · irwinb
Это можно сделать двумя способами. Раньше я просто вызывал setColor для спрайта, выбрав цвет, близкий к тому, что вы ищете. Это сработало для моих целей.
my_sprite.setColor (ccc3 (128, 128, 128));
Другое решение (более полное и точное): как реализовать рендеринг в оттенках серого в OpenGL?