AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

images.pixel函数可能有点问题

Open wengzhenquan opened this issue 8 months ago • 6 comments

images.pixel(binaryImg,x, y); 或者我改成binaryImg.pixel(x, y); 都报了同样的异常: 方法 images.pixel 调用失败. Index 1 out of bounds for length 1 (/data/user/0/org.autojs.autojs6/cache/tmp-scripts/tmp-1743492325949.js#22)

然而,x=0,y=0 长度怎么会越出边界?

Image Image

甚至我硬编码手动把值改成x=1,y=1也是报一样的错误

wengzhenquan avatar Apr 01 '25 07:04 wengzhenquan

我发现,将图片保存本地后,重新读取图片。 用读取的那个对象来操作,就没问题了。 不过这无疑增加了io

wengzhenquan avatar Apr 01 '25 10:04 wengzhenquan

然后 .pixel读出来的值,全是负值。 怎么办呢? 哎~浮生多艰啊,好难

wengzhenquan avatar Apr 01 '25 10:04 wengzhenquan

下一版本将尝试修复上述问题.

出现上述数组越界的原因, 代码位置等信息, 可参照截图中的代码及注释内容:

Image

另外你提到了 pixel 返回的是负值.

首先如果希望返回的结果方便阅读, 如 "#FFDEAD" 这样的形式, 可使用 colors.toHex/colors.summary() 等方法.

下面解释为什么 pixel 返回值为负值.

方法 colors.pixel 返回的颜色值, 默认使用 Android 的 ColorInt 表示, 它是一个用 32 位整数表示的颜色值, 格式为 ARGB, 每 8 位表示一个颜色分量, 范围 0x00000000 - 0xFFFFFFFF.

然而在 Java 中, 整型 (int) 是有符号的, 当最高位 (表示 Alpha 的高位) 为 1 时, 整数被解释为负数.

例如对于颜色 0xFF0000FF (纯蓝色, Alpha 为 0xFF), 其二进制最高位为 1, 所以转换为十进制时会显示为负值.

在原始开源版本的 Auto.js 中如果涉及到将颜色作为参数的情况, 通常也是需要传入 ColorInt 的, 尤其是直接使用 Java/Android 与颜色相关的代码时.

如有其他相关问题, 可继续反馈.

SuperMonster003 avatar Apr 09 '25 16:04 SuperMonster003

可是,我是二值化的图片,colors.pixel的返回值不是应该0和255吗?

wengzhenquan avatar Apr 09 '25 21:04 wengzhenquan

0 与 255 是颜色分量值, 不能作为最终颜色值, 因为颜色值 (ARGB) 的范围是 0x00000000 至 0xFFFFFFFF.

如果你将 0 和 255 作为颜色值使用, 它们分别表示 0x00000000 与 0x000000FF. 一个是完全透明的纯黑色, 一个是完全透明的纯蓝色.

如果你希望表示一个单通道黑色, 他应该是 0xFF000000, 转换为 ColorInt 是 -16777216; 如果希望表示一个单通道白色, 他应该是 0xFFFFFFFF, 转换为 ColorInt 是-1.

因此对于二值化图片, colors.pixel 将固定返回两个值, -16777216 与 -1. 它们均属于 Android 的 ColorInt 颜色值.

Sent from my XQ-DQ72 using FastHub

SuperMonster003 avatar Apr 10 '25 02:04 SuperMonster003

6.6.2 版本 colors.pixel 可以接受单通道图像作为参数了. 它会固定返回 -16777216-1 两个 ColorInt 值, 分别代表纯黑色与纯白色.

SuperMonster003 avatar Apr 16 '25 18:04 SuperMonster003