6.6.2 - Alpha5 - 修复 colors.pixel 无法接受单通道图像参数的问题 (issue #350)

This commit is contained in:
SuperMonster003
2025-04-10 00:33:45 +08:00
parent b7605b679e
commit 97011d3794
2 changed files with 40 additions and 2 deletions

View File

@@ -14,6 +14,7 @@
"ScriptRuntime 使用 require 引用内置模块时可能出现的同步状态异常 (试修) _[`issue #298`](http://issues.autojs6.com/298)_",
"notice 模块缺失 getBuilder 等扩展方法的问题 _[`issue #301`](http://issues.autojs6.com/301)_",
"shizuku/shell 等方法无法接受字符串参数的问题 _[`issue #310`](http://issues.autojs6.com/310)_",
"colors.pixel 无法接受单通道图像参数的问题 _[`issue #350`](http://issues.autojs6.com/350)_",
"engines.execScript/execScriptFile 等方法执行脚本时默认工作路径异常",
"floaty.window/floaty.rawWindow 无法在子线程执行的问题",
"ui.inflate 返回值丢失 attr/on/click 等原型方法的问题",

View File

@@ -194,8 +194,45 @@ open class ImageWrapper : Recyclable, MonitorResource {
// ! 注意 `org.opencv.core.Mat.get(row, col)` 方法参数, "row" 对应 "y", "col" 对应 "x".
val pixelList = oMat.get(/* row = */ y, /* col = */ x) ?: throw Exception("Channel list is null at ($x, $y) of $this")
val (r, g, b, a) = pixelList.map { pixelValue -> pixelValue.toInt() }
return Color.argb(a, r, g, b)
// @Hint by SuperMonster003 on Apr 9, 2025.
// ! Here we assume that pixelList contains ARGB channels.
// ! If mMat does not have these channels, an IndexOutOfBoundsException will be triggered:
// # java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
// ! Therefore, it is necessary to consider cases with different numbers of channels.
// !
// ! Refer to: http://issues.autojs6.com/350
// !
// ! zh-CN:
// ! 此处默认 pixelList 为 ARGB 通道, 当 mMat 不是上述通道时, 将触发索引越界异常:
// # java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
// ! 因此需要考虑不同通道数量的情况.
// !
// ! 参阅: http://issues.autojs6.com/350
// !
// # val (r, g, b, a) = pixelList.map { pixelValue -> pixelValue.toInt() }
// # return Color.argb(a, r, g, b)
return when (pixelList.size) {
1 -> {
// Single-channel image (grayscale/binary/...)
// zh-CN: 单通道图像 (灰度图/二值图/...)
val value = pixelList[0].toInt()
Color.argb(255, value, value, value)
}
3 -> {
// RGB
val (r, g, b) = pixelList.map { it.toInt() }
Color.argb(255, r, g, b)
}
in 4..Int.MAX_VALUE -> {
// RGBA
val (r, g, b, a) = pixelList.map { it.toInt() }
Color.argb(a, r, g, b)
}
else -> {
throw Exception("Unsupported pixel channel count (${pixelList.size}) at ($x, $y) of $this")
}
}
}
plane?.let { oPlane ->
val buffer = oPlane.buffer.apply { position(0) }