获取和设置CCSprite(cocos2d-x)中像素的RGB / RGBA值

6

我为什么需要这个?

基本上,我需要将一张彩色图片转换成灰度图像。包括灰度版本的图像可能是一个解决方案,但在我的情况下空间很紧 - 我不希望我的APK文件太大。此外,我还想对像素进行一些特效处理。同样,这也是为了使APK文件更小。

我找到了来自CCTexture2D的getPixel setPixel获取图像像素RGBA,但我想要更简单的东西。

任何帮助都将不胜感激。

谢谢!

2个回答

7

以下是我的解决方案:

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);

我理解你是如何查看rgba值的,因为你设置了char r = *pixel。但是你如何改变像素的值呢?我有点困惑你在指针方面做了什么。你能解释一下吗? - Rahul Iyer
1
@John 当然可以。这几乎是相似的。正如你所理解的那样,我们可以使用 *pixel 指针访问每个像素的 R 值。这是读取 (xxx=*pixel) 和写入 (*pixel=xxx) 访问。(对于 G 等等,请使用 *(pixel+1)) - Emadpres
你不是在做 *data = new unsigned..... 然后在下一行又做 data = img->getData() 吗?这样不会泄漏内存吗? - Rahul Iyer
@John 在使用 getData() 之前,你需要先分配一些内存。无论如何,你是正确的,你当然要在过程结束时释放 data 的内存: delete data - Emadpres
哈哈...其实我向别人询问了这个问题,他们告诉我基于使用new以及下一行代码的情况下,我正在泄漏数据..... 我执行了删除操作,但是我没有分配内存...现在我只是直接进行赋值(而不是分配内存),因为img已经分配了,不需要再次分配,我感觉像towelie(南方公园卡通角色)......我不知道发生了什么.. .XD - Rahul Iyer
@John 嗯,我几年前写了这段代码,在那段时间里我发现需要分配内存。但是Cocos2dx每个月都在改进,他们可能已经改变了getData()的行为。无论如何,我现在无法测试它,请检查是否需要分配内存。 - Emadpres

0
这可以通过几种方式来完成。我过去所做的就是在精灵上调用setColor,将其设置为接近您所需颜色的颜色。这对我的目的很有效。
my_sprite.setColor(ccc3(128, 128, 128));
另一种解决方案(更全面和精确): 如何在OpenGL中实现灰度渲染?

我知道setColor(),但那不是我想要的。感谢您提供的链接! - Siu Ching Pong -Asuka Kenji-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接