pixel = pixel + (y * 480) + x;若他是正确的,我就只能假定他是以图片的左上角为原点计算的,因为图片加载我在这里假想一下,它是从左上角那个点开始,一行一行进行加载的,我极端的举一个例子,若坐标(100,0)我们取到的肯定是图片第一行第一百像素点的颜色值。相较于正确的坐标系来讲(原点(0,0)),若图片的高度是480的话,我们真正取到像素的坐标其实是(100,480)。我只能说明到这里了,希望能看懂。 @H_403_0@我还要再抛一个问题,0x80FFFF00是50%透明的黄色,这句话是我在别的地方看到的,应该是准确的,第一个byte位是透明度,若按照ARGB的先后顺序来理解的话,末尾的byte应该是blue,然后遗憾的是red,当我使用正确的图片资源时(下面会解释),颜色值能取对,我想方法应该是没有问题的,暂且留下这个疑问。 @H_403_0@为什么是正确的图片资源,事先为做测试,我是通过QQ截屏截的是Windows画图程序中的选择颜色线条状的图片,无论我怎么尝试,甚至颠覆理论去理解,但是颜色总是取的不对,后来我为了减轻难度我又截屏Windows画图程序中的选择颜色方格的图片,结果依然是不行。这里我不想骂这个截屏功能,可能是因为我的无知才导致了这场悲剧的发生。 @H_403_0@首先我上传图片资源: @H_403_0@
@H_403_0@接下来我贴出我的代码资源(三段代码哦):
_colorPicker = Sprite::create("ColorPickerNew.png"); _colorPicker->setPosition(_colorPicker->getContentSize().width / 2,_colorPicker->getContentSize().height / 2); this->addChild(_colorPicker); _colorImage = new Image(); _colorImage->initWithImageFile("ColorPickerNew.png"); bool SettingLayer::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { Point location = touch->getLocation(); if (_colorPicker->getBoundingBox().containsPoint(location)) { unsigned char *data = _colorImage->getData(); unsigned int *pixel = (unsigned int *)data; pixel = pixel + (220 * (unsigned int)(220 - location.y)) + (unsigned int)location.x; BoardScene *runingScene = (BoardScene *)Director::getInstance()->getRunningScene(); runingScene->setColor(*pixel); return true; } return false; } void BoardLayer::setColor(unsigned int color) { GLubyte r = color & 0xff; GLubyte g = (color >> 8) & 0xff; GLubyte b = (color >> 16) & 0xff; GLubyte a = (color >> 24) & 0xff; _drawColor = Color4F(Color4B(r,g,b,a)); }