gamemaker吧 关注:13,514贴子:93,935
  • 10回复贴,共1

怎么做到求一个精灵上某一点的RGB值及这个精灵的长宽呢_(:

只看楼主收藏回复

怎么做到求一个精灵上某一点的RGB值及这个精灵的长宽呢_(:з」∠)_


IP属地:广东来自Android客户端1楼2023-02-25 07:38回复
    sprite上的点无法直接获取颜色,但可以把sprite画出来再获取。常用的是draw_getpixel、surface_getpixel、surface_getpixel_ext这3个。注意GM本身的混色模式决定了半透明的东西画到全透明的表面时,颜色仍然会受到背景色的干扰(结果的不透明度值也有错误),必要时请使用blendmode ext (bm_one,bm_zero)。虽说用计算也能还原但存在精度问题。
    另外这几个函数都存在显著的效率问题,如果需要连续大量获取,更推荐将surface的数据转移到buffer然后直接读buffer。由surface转移到的buffer数据结构是1像素→4字节,从左上角开始逐行进行,4字节的顺序无非就是RGBA、BGRA、ARGB、ABGR这几种,试一下就能试出来。


    IP属地:北京2楼2023-02-26 19:02
    收起回复
      获取宽度的函数是sprite_get_width。
      另外这些回答基于题主是想在游戏运行期间后载入图片。如果是本身就在游戏里的图片,在有使用需求的情况下更建议提前记录长宽。


      IP属地:北京3楼2023-02-26 19:04
      回复
        感谢回答


        IP属地:广东来自Android客户端4楼2023-03-01 22:23
        回复
          那如果是直接读取一个外部图片要怎么做呢\(`Δ’)/


          IP属地:广东来自Android客户端5楼2023-03-02 19:18
          回复
            这个追问的意思是,在不将外部图片载入成sprite的情况下获取相关信息??(如果载入的话上面的回答已经解决了)
            0、既然不载入成为sprite,那就只能直接读取图片
            1、需要二进制文件或buffer处理能力
            2、需要了解会用到的几种图片的文件格式构成
            总之,不是很推荐这样的想法。以BMP为例,长宽信息位于文件头固定位置,特定坐标的像素颜色要根据长宽、颜色深度、是否有行补偿、是否逆行序等情况找到对应位置的字节读取,并根据图片是正常颜色计算还是索引色来决定是否要引用到颜色表,最后才能获取颜色内容。jpg和png由于数据存在压缩,需要对对应区域(甚至可能全图)数据解压以后才能计算出特定坐标的颜色。


            IP属地:北京6楼2023-03-03 10:54
            回复
              感谢回复。那要怎么surface数据移动到buffer中且读取呢,我试过直接用表面绘制,感觉速度比较慢_(:з」∠)_


              IP属地:广东来自Android客户端7楼2023-03-04 10:18
              收起回复