cocos2d-x lua 3.10 在lua层得到像素rgba数据

C++层实现原文:
http://www.jianshu.com/p/16fa878f74c2

因为lua层 没有
Image:getData()
这个接口
所以只能自己导出
为了避免导出整个数据 可能会引起大容量内存的复制
所以我只做了一个 得到一个像素点数据的接口
接口如下:

//G:\Mycocos310Cpp\touchAlpha\cocos2d\cocos\platform\CCImage.h
Color4B Image::getOneData(int nTouch_x, int nTouch_y, Size imageSize)
{
    int picx = nTouch_x;
        //png在内存中是从左上角开始读取像素的 而cocos是左下角开始 需要转换(记得-1)
    int picy = imageSize.height - nTouch_y - 1;
    CCLOG("x = %d, y = %d", picx, picy);

    Color4B color4B = { 0, 0, 0, 0 };
    unsigned int *pixel = (unsigned int *)_data;
    pixel = pixel + (picy * (int)imageSize.width) * 1 + picx * 1;
    //R通道
    color4B.r = *pixel & 0xff;
    //G通道
    color4B.g = (*pixel >> 8) & 0xff;
    //B通过
    color4B.b = (*pixel >> 16) & 0xff;
    //Alpha通道,我们有用的就是Alpha
    color4B.a = (*pixel >> 24) & 0xff;
    return color4B;
}
//G:\Mycocos310Cpp\touchAlpha\cocos2d\cocos\platform\CCImage.cpp
/**
@by lyf 2017年11月11日(双十一)
@得到一个像素的数据
@param nTouch_x 鼠标点击到图片的坐标 X 从左下角开始计算
@param nTouch_y 鼠标点击到图片的坐标 X 从左下角开始计算
@param imageSize 图片的范围大小 getContentSize()
@return  该像素点颜色值(包括alpha通道)
*/
Color4B getOneData(int nTouch_x, int nTouch_y, Size imageSize);

导出到lua接口

//E:\Cocos\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp
tolua_function(tolua_S, "getOneData", lua_cocos2dx_Image_getOneData);
image.png
//E:\Cocos\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp
//新增lua导出获得一个像素点的具体像素值 包括通道
int lua_cocos2dx_Image_getOneData(lua_State* tolua_S)
{
    int argc = 0;
    cocos2d::Image* cobj = nullptr;
    bool ok = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif

    cobj = (cocos2d::Image*)tolua_tousertype(tolua_S, 1, 0);

#if COCOS2D_DEBUG >= 1
    if (!cobj)
    {
        tolua_error(tolua_S, "invalid 'cobj' in function 'lua_cocos2dx_Image_getOneData'", nullptr);
        return 0;
    }
#endif

    argc = lua_gettop(tolua_S) - 1;
    if (argc == 3)
    {
        int arg0;
        int arg1;
        cocos2d::Size arg2;
        ok &= luaval_to_int32(tolua_S, 2, (int *)&arg0, "cc.Image:getOneData");
        if (!ok)
        {
            tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
            return 0;
        }
        ok &= luaval_to_int32(tolua_S, 3, (int *)&arg1, "cc.Image:getOneData");
        if (!ok)
        {
            tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
            return 0;
        }
        ok &= luaval_to_size(tolua_S, 4, &arg2, "cc.Image:getOneData");
        if (!ok)
        {
            tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
            return 0;
        }
        const cocos2d::Color4B& ret = cobj->getOneData(arg0, arg1, arg2);
        color4b_to_luaval(tolua_S, ret);
        return 1;
    }
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Text:getTextColor", argc, 0);
    return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_Image_getOneData'.", &tolua_err);
#endif

    return 0;
}

写完后编译
拷贝发生改变的exe 和 libcocos2d.dll


image.png

因为我是在框架项目中改变的 其余项目共享exe 和dll框架
所以框架改变后需要拷贝 如果只是一份项目 则无需此步

lua层调用代码 先来个简单的接口调用部分

--i:\Test310\simulator\win32\src\app\views\MainScene.lua
local MainScene = class("MainScene", cc.load("mvc").ViewBase)

--MainScene.RESOURCE_FILENAME = "MainScene.csb"
function MainScene:onCreate()
    printf("resource node = %s", tostring(self:getResourceNode()))
    
    self.sprite = cc.Sprite:create("red3.png")
    self.sprite:setPosition(50, 50)
    self:addChild(self.sprite, 1)
    local size = self.sprite:getContentSize() -- 返回size

    local pImage = cc.Image:new()
    pImage:initWithImageFile("red3.png")
    local size = self.sprite:getContentSize()
    for j = 0, 2 do
        for i = 0, 2 do
            print(i, j)
            local ovt = pImage:getOneData(i, j, size)
            dump(ovt, "ovt = ")--仅需这里打印像素数据测试
        end
    end
    --pImage 这里结束后就直接回收了 没有addChild
end

return MainScene

打印结果

[LUA-print] resource node = nil
libpng warning: iCCP: known incorrect sRGB profile
[LUA-print] 0   0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 1   0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 2   0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 0   1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 1   1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 0
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 0
[LUA-print] -     "r" = 0
[LUA-print] - }
[LUA-print] 2   1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 0   2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 1   2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }
[LUA-print] 2   2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] -     "a" = 255
[LUA-print] -     "b" = 0
[LUA-print] -     "g" = 255
[LUA-print] -     "r" = 92
[LUA-print] - }

上传图片样式


image.png

可自行下载原图


red3.png

图片就是一张9像素 3*3的绿色图片 中间1像素镂空

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容