Pertanyaan Mendapatkan dan mengatur nilai RGB / RGBA dari sebuah piksel dalam CCSprite (cocos2d-x)


Mengapa saya membutuhkan ini?

Pada dasarnya saya harus mengubah gambar warna menjadi skala abu-abu. Menyertakan versi gambar skala abu-abu bisa menjadi solusi, tetapi ruang sangat ketat dalam situasi saya - saya tidak ingin APK saya terlalu besar. Selain itu, saya ingin bekerja pada piksel untuk beberapa efek juga. Sekali lagi, ini untuk membuat APK lebih kecil.

saya telah menemukan getPixel setPixel dari CCTexture2D dan Mendapatkan RGBA piksel gambar, tapi saya ingin sesuatu yang lebih sederhana.

Bantuan apa pun dihargai.

Terima kasih!


6
2018-03-12 10:50


asal


Jawaban:


Inilah solusi saya untuk Anda:

1.Pertama membuat versi CCImage dari gambar Anda:

I) dari File:

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

II) Dari Sprite:

  • II.1) CCSprite -> RenderTexture2D

  • II.2) RenderTexture2D -> CCImage (CCImage *testImage = RenderText2D->newCCImage();)

2.Lalu Anda dapat melakukan apa yang Anda butuhkan:

    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.Lalu, ubah menjadi texture_2D

//CCImage -> Texture2d
    texture_2D= new CCTexture2D();
    texture_2D->initWithImage(img);

4. Dan akhirnya kembali ke CCSprite

CCSprite *result=  CCSprite::createWithTexture(texture_2D);

7
2017-08-22 16:53



Ini bisa dilakukan dengan beberapa cara. Apa yang telah saya lakukan di masa lalu adalah dengan hanya memanggil setColor pada sprite ke beberapa warna yang mendekati apa yang Anda cari. Itu berhasil untuk tujuan saya.

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

Solusi lain (lebih teliti dan tepat): bagaimana menerapkan rendering grayscale di OpenGL?


0
2018-03-13 01:03