要获取图片的某一点的颜色,先要创建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开辟内存中,图片像素点的存储顺序我并没有找到相关资料,所写的结果是我自己画了张图测试出来的,仅供参考。