为什么我需要这个?
基本上我需要将彩色图像变成灰度。包括图像的灰度版本可能是一个解决方案,但在我的情况下空间很紧张 - 我不希望我的 APK 太大。此外,我也想处理像素以获得一些效果。同样,这是为了使 APK 更小。
我从 CCTexture2D和获取图像的像素 RGBA中找到了 getPixel setPixel ,但我想要更简单的东西。
任何帮助表示赞赏。
谢谢!
为什么我需要这个?
基本上我需要将彩色图像变成灰度。包括图像的灰度版本可能是一个解决方案,但在我的情况下空间很紧张 - 我不希望我的 APK 太大。此外,我也想处理像素以获得一些效果。同样,这是为了使 APK 更小。
我从 CCTexture2D和获取图像的像素 RGBA中找到了 getPixel setPixel ,但我想要更简单的东西。
任何帮助表示赞赏。
谢谢!
这是我为您提供的解决方案:
1.首先制作您的图像的CCImage版本:
一)从文件:
CCImage *img= new CCImage();
img->initWithImageFile("colors.png");
二)从雪碧:
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);
这可以通过几种方式完成。我过去所做的只是将精灵上的 setColor 调用为接近您正在寻找的颜色。这对我的目的有用。
my_sprite.setColor(ccc3(128,128,128));
另一种解决方案(更彻底和更精确): 如何在OpenGL中实现灰度渲染?