gpt4 book ai didi

Javascript 未签名短灰度图像

转载 作者:行者123 更新时间:2023-12-02 16:25:09 25 4
gpt4 key购买 nike

我正在将类型为 TYPE_USHORT_GRAY 的 Java BufferedImage 编码为 base64,并通过 REST api 将其提供给 Javascript 客户端。

我可以在服务器端清楚地检查适当范围(0到65k)内的不同像素值,但canvas api似乎只提供rgba像素,导致我的用例出现 Not Acceptable 精度损失。

客户端 JavaScript 是否可以通过 Canvas 或其他 api 读取和操作(但不显示)无符号短灰度图像的像素值?

最佳答案

是的,您可以将像素存储在 Uint16Array 缓冲区中,然后从中读取和写入亮度值。请注意,字节顺序(网络/大端与小端)很重要 - DataView 可以帮助您,或者如果传入缓冲区是大端则交换字节顺序。

另请注意,超出范围的值将进行模处理,因此您需要手动剪辑它们(或使用掩码 0xffff 写入)。然后使用索引将每个亮度值作为普通数组进行访问。

但是,如果您打算进行大量处理,我建议使用浮点缓冲区而不是标准化值,使用 Float32ArrayFloat64Array - 前者更快,后者更准确。这还允许您根据需要将动态范围插入和推出,除非您需要限制每次传递的值。

标准化(显而易见,但为了记录):

newLum = oldLum / 0xffff;

提示:要获得更准确的预览(如果您一路上需要的话),请使用以下方法缩小尺寸 - 原则上适用于任何深度:

var inDepth = Math.pow(2, 16) - 1;   // 65535
var outDepth = Math.pow(2, 8) - 1; // 255

然后对于每个亮度值:

var r,g,b,a;
r = g = b = (lum * outDepth / inDepth + 0.5)|0; // or, in this case -
r = g = b = (lum * 0.0038910505836575876 + 0.5)|0;
a = 255;

如果源使用 Gamma ,则需要在处理之前将 Gamma 转换为线性,完成后重新应用 Gamma 。

你总是可以进行掩码/移位操作。但这不会那么准确。

(Canvas 将始终使用基于 8 位的 RGBA 缓冲区)。

关于Javascript 未签名短灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com