日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

cocos获取图片像素

發(fā)布時(shí)間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos获取图片像素 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//一下是獲取某個(gè)像素的透明值,以此類推可以回去r,g,b的值 Image *myImage = new Image(); myImage->initWithImageFile("test.png"); unsigned char *data = myImage->getData(); //這里就是圖片數(shù)據(jù)了 //根據(jù)剛剛計(jì)算的相對(duì)坐標(biāo)值,計(jì)算出觸摸點(diǎn)代表了哪一個(gè)像素點(diǎn) 然后再提取出該像素點(diǎn)的alpha值 //注意:因?yàn)閳D片坐標(biāo)(0,0)是在左上角,所以要和觸摸點(diǎn)的Y轉(zhuǎn)換一下,也就是“(myImage->getHeight() - (int)(ps.y) - 1)” //該data值是把二維數(shù)組展開(kāi)成一個(gè)一維數(shù)組,因?yàn)槊總€(gè)像素值由RGBA組成,所以每隔4個(gè)char為一個(gè)RGBA,并且像素以橫向排列 int pa = 4 * ((myImage->getHeight() - (int)(ps.y) - 1) * myImage->getWidth() + (int)(ps.x)) + 3; unsigned int ap = data[pa];

轉(zhuǎn):https://blog.zengrong.net/post/2104.html

?

我采用的是這種辦法。流程如下:

  • 在需要圖片像素值的時(shí)候,將這張圖片使用 FrameBuffer 重新繪制成像素;
  • 獲得相關(guān)像素的顏色值;
  • 刪除已經(jīng)獲得的像素。
  • 這種方法的弊端如下:

  • 如果要取得的像素圖片巨大,可能對(duì)性能有影響;
  • 每次的數(shù)據(jù)沒(méi)有緩存,頻繁執(zhí)行的話性能消耗巨大。
  • 當(dāng)然,如果確實(shí)需要在同一張圖片上多次操作,緩存可以程序員自己來(lái)做。

    為了實(shí)現(xiàn)這個(gè)流程,我修改了 CCImage.h,增加了兩個(gè)方法?getColor4B?和?getColor4F?:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ccColor4B getColor4B(float x, float y) {ccColor4B color = { 0, 0, 0, 0 };int ix = (int)x - 1;int iy = (int)y - 1;m_pData += (iy*getWidth() + ix) * 4;color.r = *(m_pData++);color.g = *(m_pData++);color.b = *(m_pData++);color.a = *(m_pData++);return color; };ccColor4F getColor4F(float x, float y) {return ccc4FFromccc4B(getColor4B(x, y)); };

    2014-10-24更新:上面的代碼沒(méi)有考慮越界問(wèn)題,在傳遞的坐標(biāo)不在圖像中時(shí),程序會(huì)崩潰。

    最新的代碼改正了問(wèn)題,請(qǐng)參考?github?。

    由于 CCImage 是跨平臺(tái)實(shí)現(xiàn)的,所以放在頭文件中比放在實(shí)現(xiàn)文件中要方便許多。否則,就需要在 CCImage 的若干個(gè)平臺(tái)相關(guān)實(shí)現(xiàn)中分別執(zhí)行實(shí)現(xiàn)了。

    下面是 quick-cocos2d-x 中的實(shí)現(xiàn)代碼,我將其放在了 CCSpriteExtned.lua 框架中,這樣能讓所有的 CCSprite 實(shí)例都支持這個(gè)方法。

    具體的實(shí)現(xiàn)請(qǐng)看代碼,不解釋了。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 -- NOTE!!! The method is very slowly! Please use it in carefully. -- @param __point A coordinate for color. -- @param __convertToNodeSpace Optional, default is true, convert a coordinate to node space from world space. -- @param __isFloat Optional, default is false, convert a coordinate to node space from world space. function CCSpriteExtend:getColor(__point, __convertToNodeSpace, __isFloat)if __convertToNodeSpace == nil then__convertToNodeSpace = trueendif __convertToNodeSpace then__point = self:convertToNodeSpace(__point)end-- Create a new Texture to get the pixel datas.local __size = self:getContentSize()local __rt = CCRenderTexture:create(__size.width, __size.height)-- Hold the old anchor and position to restore it late on.local __oldAnchor = self:getAnchorPoint()local __oldPos = self:getPositionInCCPoint()-- Move the sprite to left bottom.self:align(display.LEFT_BOTTOM, 0,0)--print("getColor:", __point.x, __point.y, __size.width, __size.height)-- Render the sprite to get a new texture.__rt:begin();self:visit()__rt:endToLua();-- Restore the original anchor and position.self:setAnchorPoint(__oldAnchor)self:setPosition(__oldPos)local __img = __rt:newCCImage(false)local __color = nilif __isFloat then__color = __img:getColor4F(__point.x, __point.y)else__color = __img:getColor4B(__point.x, __point.y)endreturn __color, __rt end-- Only get a alpha value. function CCSpriteExtend:getColorAlpha(__point, __convertToNodeSpace, __isFloat)local color = self:getColor(__point, __convertToNodeSpace, __isFloat)return color.a en

    這個(gè)方法已經(jīng)合并進(jìn)入?quick-cocos2d-x 的 develop 分支。

    2014-10-24更新:由于 newCCImage 方法在 C++ 中是請(qǐng)求堆內(nèi)存并返回一個(gè)指針。因此必須手動(dòng)釋放。上面的代碼沒(méi)有考慮釋放問(wèn)題,將會(huì)導(dǎo)致內(nèi)存泄露。

    最新的代碼改正了問(wèn)題,請(qǐng)參考?github?。

    總結(jié)

    以上是生活随笔為你收集整理的cocos获取图片像素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。