2012-03-12 24 views
6

なぜこれが必要ですか?CCSprite(cocos2d-x)のピクセルのRGB/RGBA値の取得と設定

基本的には、カラー画像をグレースケールに変換する必要があります。画像のグレースケールバージョンを含むことは解決策になるかもしれませんが、私の状況ではスペースが狭いです。私はAPKが大きすぎないようにしたくありません。また、いくつかの効果のためにピクセルについても作業したいと思います。再び、これはAPKを小さくすることです。

私はgetPixel setPixel from CCTexture2DGetting image's pixel RGBAを見つけましたが、もっと簡単なものがあります。

何か助けていただければ幸いです。

ありがとうございました!

答えて

7

ここではあなたのための私のソリューションです:ファイルから

I):

1.Firstは、あなたのイメージのCCImageバージョンを行います。スプライトから

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

II):

  • II.1)CCSprite - > RenderTexture2D

  • II.2)RenderTexture2D - あなたはあなたが必要なものを行うことができます> CCImage(CCImage *testImage = RenderText2D->newCCImage();

2.Then:

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.Andは、最後に戻ってCCSprite

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

char r = *ピクセルを設定しているので、rgbaの値がどのように表示されるか分かります。しかし、どのようにピクセルの値を変更しますか?あなたが指針で何をやっているのかちょっと混乱しています。説明できますか ? –

+1

@ジョンそれはほぼ同じです。わかったように、 '* pixel'ポインタを使って各ピクセルの' R'値にアクセスすることができました。これはRead( 'xxx = * pixel')とWrite(' * pixel = xxx')アクセスです。 ( 'G 'に' *(pixel + 1) 'を使用するなど) – Emadpres

+0

* data = new unsigned .....を実行してメモリをリークしていないのであれば、次の行でdata = img-> getData ()? –

0

これはいくつかの方法で行うことができます。私が過去に行ったことは、あなたが探している色に近い色にスプライト上でsetColorを呼び出すことです。それは私の目的のために働いていた。

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

別の解決策(より徹底的かつ正確に): how to implement grayscale rendering in OpenGL?

+0

に私はsetColorを()を知っているが、それは私が欲しいものではありません。あなたのリンクをありがとう! –

関連する問題