能用cocos2d-x实现一个类似改变色相的功能吗?求大牛解答!

想用一张蓝色的纹理做出红色纹理的效果见图

应该是可以的

取出像素点 改变颜色

恩恩主要的思路确实是这样用Image->getData();,但是我主要是不知道它单个像素点的r,g,b改变的规律是什么呢?不知道怎么去计算这个。
求大牛解答~

CCImage *finalImage = new CCImage;
finalImage->initWithImageFile(“hero.png”, CCImage::kFmtPng);
unsigned char *pData = fin
for (int i = 0; i < finalImage->getHeight(); i ++)
{
for (int j = 0; j < finalImage->getWidth(); j ++)
{
// gray
int iBPos = iIndex;
int indexB =iIndex;
iIndex ++;
int indexG = iIndex;
iIndex ++;
int indexR = iIndex;
iIndex ++;
int indexA = iIndex;
unsigned int iB = pData;
unsigned int iG = pData;
unsigned int iR = pData;
if (iB == 37 && iG == 240 && iR == 248)
{
CCLog(“iR == 37 && iG == 240 && iB == 248”);
pData = iB + 207;
pData = iG - 184;
pData = iR - 192;
}
}
}

CCTexture2D *texture = new CCTexture2D; 
texture->initWithImage(finalImage);

CCSprite* pSprite = CCSprite::createWithTexture(texture);
pSprite->setPosition(ccp(size.width/2 + 20, size.height/2 - 20)); 
addChild(pSprite, 6);
delete finalImage; 
texture->release();

想在这个上面进行修改,但是对单个像素的色值修改有疑问。

少个变量int iIndex = 0;放在最上面。

已经找到了一个可以改变色相的帖子,网址是http://www.cocoachina.com/bbs/read.php?tid-208539-page-1.html
里面有一个变色龙的例子就是,引擎支持是2.2.3或者更高版本,2x的,3x不支持。

用了一个比较笨的方法实现的,希望大家有更好的方法,上代码。

bool TextureToColor::init()
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
int iIndex = 0;
// !这里是以jpg图片为例,若载入的是png,则要注意处理alpha通道
CCImage *finalImage = new CCImage;
finalImage->initWithImageFile(“abul.png”, CCImage::kFmtPng);
unsigned char *pData = finalImage->getData();
int matchTime = 0;
for (int i = 0; i < finalImage->getHeight(); i ++)
{

    for (int j = 0; j < finalImage->getWidth() * 4; j ++)
    {
        if (iIndex % 4 == 0)
        {
            pData = isMatch(pData, iIndex);
            matchTime ++;
        }
        iIndex++;
    }
}
CCTexture2D *texture = new CCTexture2D;
texture->initWithImage(finalImage);

CCSprite* pSprite = CCSprite::createWithTexture(texture);
pSprite->setPosition(ccp(size.width/2 + 20, size.height/2 - 20));
addChild(pSprite, 6);
delete finalImage;
texture->release();


return true;

}

unsigned char* TextureToColor::isMatch(unsigned char* data, int index)
{
// b: 40,160,248
// r: 224,16,17
//
// b: 56,80,224
// r: 168,48,40
//
// b: 88,72,120
// r: 104,72,96
//
// b: 143,184,232
// r: 191,168,184
//
// b: 56,56,144
// r: 96,40,32
//
// b: 216,232,240
// r:224,224,224
//
// b: 24,240,248
// r:248,80,72
if (data == 40 && data == 160 && data == 248)
{
data = 224;
data = 16;
data = 16;
}
else if(data == 56 && data == 80 && data == 224)
{
data = 168;
data = 48;
data = 40;
}
// b: 88,72,120
// r: 192,168,184
else if(data == 88 && data == 72 && data == 120)
{
data = 192;
data = 168;
data = 184;
}
// b: 143,184,232
// r: 191,168,184
else if(data == 143 && data == 184 && data == 232)
{
data = 191;
data = 168;
data = 184;
}
// b: 56,56,144
// r: 96,40,32
else if(data == 56 && data == 56 && data == 144)
{
data = 96;
data = 40;
data = 32;
}
// b: 216,232,240
// r:224,224,224
else if(data == 216 && data == 232 && data == 240)
{
data = 224;
data = 224;
data = 224;
}
// b: 24,240,248
// r:248,80,72
else if(data == 24 && data == 240 && data == 248)
{
data = 248;
data = 80;
data = 72;
}
return data;
}

这是资源文件,大家有兴趣可以试一下。

3.x改变色相的代码我今天还刚刚看见过一个,还因为不是2.x惆怅了一阵呢。。找找

感谢版主提醒,有空儿去看看。

分享一下~ https://github.com/alex314/CCSpriteWithHue
这是国外开发者做的,我在3.3的引擎上仿照实现了一个,后面抽空分享到自己的blog,你先参考着用吧

感谢分享,效果很好哎!好好学习一下。:2: