我为什么需要这个?
基本上,我需要将一张彩色图片转换成灰度图像。包括灰度版本的图像可能是一个解决方案,但在我的情况下空间很紧 - 我不希望我的APK文件太大。此外,我还想对像素进行一些特效处理。同样,这也是为了使APK文件更小。
我找到了来自CCTexture2D的getPixel setPixel和获取图像像素RGBA,但我想要更简单的东西。
任何帮助都将不胜感激。
谢谢!
我为什么需要这个?
基本上,我需要将一张彩色图片转换成灰度图像。包括灰度版本的图像可能是一个解决方案,但在我的情况下空间很紧 - 我不希望我的APK文件太大。此外,我还想对像素进行一些特效处理。同样,这也是为了使APK文件更小。
我找到了来自CCTexture2D的getPixel setPixel和获取图像像素RGBA,但我想要更简单的东西。
任何帮助都将不胜感激。
谢谢!
以下是我的解决方案:
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);
*pixel
指针访问每个像素的R
值。这是读取 (xxx=*pixel
) 和写入 (*pixel=xxx
) 访问。(对于G
等等,请使用*(pixel+1)
) - EmadpresgetData()
之前,你需要先分配一些内存。无论如何,你是正确的,你当然要在过程结束时释放data
的内存:delete data
。 - EmadpresgetData()
的行为。无论如何,我现在无法测试它,请检查是否需要分配内存。 - Emadpres