【问题标题】:Getting and setting the RGB / RGBA value of a pixel in a CCSprite (cocos2d-x)获取和设置 CCSprite 中像素的 RGB/RGBA 值 (cocos2d-x)
【发布时间】:2012-03-28 18:31:18
【问题描述】:

我为什么需要这个?

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

我找到了getPixel setPixel from CCTexture2DGetting image's pixel RGBA,但我想要更简单的东西。

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: rgb ccsprite grayscale rgba cocos2d-x


    【解决方案1】:

    这是我的解决方案:

    1.首先制作你的图片的CCImage版本:

    I) 来自文件:

    CCImage *img=  new CCImage();
    img->initWithImageFile("colors.png");
    

    II) 来自雪碧:

    • 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.但是你如何改变像素的值呢?我对你用指针做什么感到有点困惑。你能解释一下吗?
    • @John Sure。这几乎是相似的。如您所知,我们可以使用*pixel 指针访问每个像素的R 值。这是读取 (xxx=*pixel) 和写入 (*pixel=xxx) 访问。 (使用*(pixel+1) 表示G 等等)
    • 你不是通过执行 *data = new unsigned..... 然后在下一行执行 data = img->getData() 来泄漏内存吗?
    • @John 要使用getData(),您需要预先分配一些内存。无论如何你是对的..你当然必须在程序结束时释放data内存:delete data
    • 哈哈...实际上我问了其他人一个关于这个的问题,他们告诉我我是基于做新的泄漏数据,然后是我提到的下一行.....我做了删除但我没有分配......现在我只是立即分配(不分配),因为它不是已经被 img 分配了吗?我觉得像毛巾一样...我不知道发生了什么..XD
    【解决方案2】:

    这可以通过多种方式完成。我过去所做的只是将精灵上的 setColor 调用为接近您正在寻找的颜色。这对我的目的很有效。

    my_sprite.setColor(ccc3(128,128,128));

    另一种解决方案(更彻底和更精确): how to implement grayscale rendering in OpenGL?

    【讨论】:

    • 我知道 setColor(),但这不是我想要的。感谢您的链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2016-10-05
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多