先说结论:能做,而且不用拓展。
这个问题最近被问了好几次,场景各不相同:有人拍了张答题卡,想知道哪几个格子涂黑了;有人做巡线小车的上位机,想从摄像头画面里找出黑线的位置;还有人单纯想做个「点哪显示哪」的取色小工具。
归根结底都是一件事:给一个点,判断它黑不黑;再把所有黑的点找出来。

App Inventor 里有三块积木正好能拼出来:
灰度图有个好处:红绿蓝三个数是一样的,拆出来随便取一个就是灰度,0 是纯黑,255 是纯白。

把灰度图设成画布的背景图,再放一个标签。手指点到哪里,就把那一点的坐标和灰度显示出来:

点在黑色笔画上,显示「是深色」;点在白底上,显示「不是深色」。阈值 128 不是死的,图片偏灰就调低,想把浅灰也算进来就调高。
颜色抽屉里其实还有一块现成的「是深色吗」。它按人眼感知的亮度来判断,界线大约在灰度 188,所以中灰也会被算成深色。要「明显发黑才算」,还是像上面这样自己比阈值更好控制。
单点判断会了,扫描整张图就是两层循环的事。多数时候我们要的不是几千个点,而是「黑的那一块在哪」,所以扫描时顺手记下最左、最右、最上、最下,最后画个红框圈出来:

里面的 gap 是采样间隔,4 就是每隔 4 个点看一次,比逐点扫快 16 倍,找黑块的位置完全够用。
坑一:坐标对不上原图。 画布会把背景图缩放到画布大小,上面拿到的是画布坐标。原图 1000 像素宽、画布 360 宽的话,画布上的 1 格相当于原图将近 3 个像素。要原图坐标,用「图片处理」组件取出原图宽高,按比例乘回去就行。
坑二:扫大图时界面点不动。 积木循环跑在界面线程里,一口气扫完之前,App 是「卡住」的。办法有两个:把 gap 调大;或者让计时器每次只扫一行,边扫边显示进度,界面始终能响应。
还有个小细节:画上去的红框也会被「获取背景像素色值」读到,所以要先扫描、后画框,重新扫描前先清一下画布。
这几块积木安卓和鸿蒙都支持,写法一样。图片如果是彩色的,先用「图片处理」的灰度功能转一下再扫。
完整的文档里有五个递进的小实验:点哪判哪、列出全部深色点坐标、求深色区域、换算原图坐标、分批扫描不卡顿,每一段积木都能直接照着搭。在 fun123.cn 搜「深色像素」就能找到。
答题卡识别、巡线定位、取色工具,都可以从这几块积木起步。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。