level 7
怎么做到求一个精灵上某一点的RGB值及这个精灵的长宽呢_(:з」∠)_
2023年02月24日 23点02分
1
吧务
level 13
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这几种,试一下就能试出来。
2023年02月26日 11点02分
2
谁告诉你就4种了?
2023年02月28日 00点02分
@圭臬乃 4字节的排列方式是24种,然而常规使用方式RGB必相邻且G必在中间,且之前验证过surface转buffer的格式就在这4种之一。或者你打算拿出证据证明真实格式是在剩下的20种里?
2023年02月28日 03点02分
吧务
level 13
获取宽度的函数是sprite_get_width。
另外这些回答基于题主是想在游戏运行期间后载入图片。如果是本身就在游戏里的图片,在有使用需求的情况下更建议提前记录长宽。
2023年02月26日 11点02分
3
level 7
那如果是直接读取一个外部图片要怎么做呢\(`Δ’)/
2023年03月02日 11点03分
5
吧务
level 13
这个追问的意思是,在不将外部图片载入成sprite的情况下获取相关信息??(如果载入的话上面的回答已经解决了)
0、既然不载入成为sprite,那就只能直接读取图片
1、需要二进制文件或buffer处理能力
2、需要了解会用到的几种图片的文件格式构成
总之,不是很推荐这样的想法。以BMP为例,长宽信息位于文件头固定位置,特定坐标的像素颜色要根据长宽、颜色深度、是否有行补偿、是否逆行序等情况找到对应位置的字节读取,并根据图片是正常颜色计算还是索引色来决定是否要引用到颜色表,最后才能获取颜色内容。jpg和png由于数据存在压缩,需要对对应区域(甚至可能全图)数据解压以后才能计算出特定坐标的颜色。
2023年03月03日 02点03分
6
level 7
感谢回复。那要怎么surface数据移动到buffer中且读取呢,我试过直接用表面绘制,感觉速度比较慢_(:з」∠)_
2023年03月04日 02点03分
7
忘了,我每次都现查,是个名字里同时有buffer和surface的函数。另外表面绘制是普通速度,慢的是“从表面上获取一个像素点的颜色”,或者是“频繁创建/释放表面”的做法。
2023年03月04日 15点03分