2

我有一个程序试图在 Kotlin 程序中设置表示为Uint8ClampedArray的 ImageData 值。根据set 方法的规范,我需要将一个 Kotlin 字节传递到数组中,但 Kotlin 字节是有符号的:

    ...create context...
    //setup pix as a js Uint8ClampedArray
    val imgd = context.createImageData(100.0, 100.0)
    val pix = imgd.data   //pix is now a Uint8ClampedArray

    //sets pix[40] to 127
    pix[40] = 127
    //gives an error - Kotlin bytes are signed, so it cannot be passed as a literal
    pix[40] = 200
    //also doesn't work, still converts to a signed byte
    pix[40] = 200.toByte()

我的问题是 Javascript 只会将其读取为 127,而不是 255。如何将此数组的值设置为大于 127?我什至找不到一种 hack-y 方法来让 JS 结果读取我想要的内容,因为最终赋值需要一个不允许大于 127 的值的有符号字节。

4

2 回答 2

4

我想到了!您可以将 UInt8 数组不安全地转换为 UInt16 数组,然后改用它,而 javascript 似乎明白了您的意思:

    //instead of val pix = imgd.data
    val pix = imgd.data.unsafeCast<Uint16Array>()
    // now you can assign values outside the -127..127 range
于 2018-03-17T13:27:29.420 回答
2

Kotlin 跟踪器存在问题 — https://youtrack.jetbrains.com/issue/KT-24583

org.khronos.webgl.Uint8ClampedArray getter 和 setter 声明使用字节。这意味着为它分配超过 127 的值并非易事。从中获得的值也违反了字节合约

此外,有人可能会争辩说它不是一个“真正的”数组。分配 0..255 范围之外的值对它来说是完全正常的。

这种情况很重要,因为它用于画布操作:https ://developer.mozilla.org/en-US/docs/Web/API/ImageData/data

于 2020-01-20T13:59:29.737 回答