Cocos2d-x中,使用Image类获取图片某一点的颜色

要获取图片的某一点的颜色,先要创建Image对象。

Image* test = new Image();
//使用图片名初始化Image
test->initWithImageFile("test.png");

Image会开辟一段内存用来存储图片的颜色信息。存储的方法是每一像素点用4个字节来存储,其中4个字节分别存储了颜色的R\G\B\A,也就是红、绿、蓝和透明度。

由于在32位的情况下,int一般占用4个字节,所以可以把存储的信息转换为int类型。

要是Image类型返回存储信息的指针,需要使用其getData()函数。

auto pixel = (unsigned int*)(test->getData());

这样一来pixel就成为了一个指向Image开辟的内存的第一个位置的指针。

然后进行颜色的初始化,这里使用Color4B举例:

Color4B color(
	(*pixel & 0xff), 
	(*pixel>>8 & 0xff), 
	(*pixel>>16 & 0xff), 
	(*pixel>>24 & 0xff)
);
因为*pixel为4字节,也就是32位,所以取这四个参数每次需要&0xff。

也就是先取出*pixel的后8位,即为此处颜色的R.

然后使*pixel向右移8位,再取后8位,即为此处颜色的G.

然后使*pixel向右移8位,再取后8位,即为此处颜色的B.

然后使*pixel向右移8位,再取后8位,即为此处颜色的A.

此时color变量里就存储了图片中左上角的像素点的颜色信息。


那么,如何才能取到自己需要的点的颜色呢?这就需要改变pixel指针的位置。

在Image开辟的内存中,图片像素点颜色的存储顺序是从左上角开始向右,到右上角后,返回第二行的最左边,然后再依次到第二行的最右边,如此这般。

所以我们只要改变指针的位置就可以了,比如要取图片中心点的颜色:

auto pixel = (unsigned int*)(test->getData())+(test->getWidth())*(test->getHeight()/2)+test->getWidth()/2-1;
代码中getWidth和getHeight函数是Image类提供的,使用方法顾名思义。

这样再对指针pixel进行上面的提取颜色的方法即可获取到图片中心点的颜色。


这个方法计算位置,用起来可能不太符合习惯,但是点的位置精确度很高,可以精确取出图片中任意一个像素点的颜色。


注:以上关于Image开辟内存中,图片像素点的存储顺序我并没有找到相关资料,所写的结果是我自己画了张图测试出来的,仅供参考。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值