爲什麼我需要這個?獲取並設置CCSprite中像素的RGB/RGBA值(cocos2d-x)
基本上我需要把彩色圖像變成灰度。包括圖片的灰度版本可能是一個解決方案,但空間很緊張 - 我不希望我的APK太大。此外,我還想在像素上進行一些特效。再次,這是爲了讓APK變小。
我找到了getPixel setPixel from CCTexture2D和Getting image's pixel RGBA,但我想要更簡單的東西。
任何幫助表示讚賞。
謝謝!
爲什麼我需要這個?獲取並設置CCSprite中像素的RGB/RGBA值(cocos2d-x)
基本上我需要把彩色圖像變成灰度。包括圖片的灰度版本可能是一個解決方案,但空間很緊張 - 我不希望我的APK太大。此外,我還想在像素上進行一些特效。再次,這是爲了讓APK變小。
我找到了getPixel setPixel from CCTexture2D和Getting image's pixel RGBA,但我想要更簡單的東西。
任何幫助表示讚賞。
謝謝!
這是我對你的解決方案:從文件
I):
1.首先讓你的圖像的CCImage版本:
CCImage *img= new CCImage();
img->initWithImageFile("colors.png");
II)從雪碧:
II.1)CCSprite - > RenderTexture2D
.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.And最後回到CCSprite
CCSprite *result= CCSprite::createWithTexture(texture_2D);
這可以通過幾種方法完成。我過去所做的就是將精靈上的setColor調用到接近你要找的顏色上。這對我的目的有效。
my_sprite.setColor(ccc3(128,128,128));
另一種解決方案(更徹底,更準確): how to implement grayscale rendering in OpenGL?
我知道的setColor(),但是這不是我想要的。感謝您的鏈接! – 2012-03-13 01:27:36
我瞭解如何查看rgba值,因爲您正在設置char r = *像素。但是,你如何改變像素的價值?我對你使用指針做什麼感到困惑。你可以解釋嗎 ? – 2016-10-05 10:59:21
@John當然。它幾乎相似。正如你所理解的,我們可以使用'* pixel'指針訪問每個像素的'R'值。這是一個Read('xxx = * pixel')和Write('* pixel = xxx')訪問。 (使用'*(像素+ 1)'爲'G'等) – Emadpres 2016-10-05 15:47:07
是不是通過執行* data = new unsigned .....來泄漏內存,然後在下一行執行data = img-> getData ()? – 2016-10-11 10:16:52