javascript 将RGB16值转换为RGB8

gg0vcinb  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(154)

我需要将RGB-16颜色值转换为RGB-8。这个问题有两个方面。

**首先,**什么是推荐的方法?

在RGB-8中,最高值是255,在RGB-16中是65535,所以似乎我可以简单地将RGB-16值除以257,这就足够了?
那么,为什么会有下面的MatLab解决方案呢?
要将RGB图像从double转换为uint 8,首先乘以255。

RGB8 = uint8(round(RGB64*255));

字符串
http://matlab.izmiran.ru/help/techdoc/creating_plots/chimag12.html
问题的第二部分,如何使用JavaScript?我试过了

const RGB16 = ...
const RGB8 = new Uint8Array(Math.round(RGB16*255));


但它似乎只是返回一个零数组。

vq8itlhq

vq8itlhq1#

将RGB-16颜色值转换为RGB-8涉及适当地缩小值以适合0-255的范围。你的直觉是正确的;您可以将RGB-16值除以257(而不是255)以获得等效的RGB-8值。
除以257而不是255的原因是65535(RGB-16的最大值)除以255得到257。该划分将确保RGB-16值的全范围(0-65535)被Map到RGB-8值的全范围(0-255)。
关于你找到的MATLAB解决方案,有一点不同。在MATLAB中,RGB图像首先通过乘以255缩放到范围[0,1](因为MATLAB的双重表示使用0和1之间的值)。然后,使用round函数将值舍入为最接近的整数,将其转换为无符号8位整数(uint8)。此步骤可确保不截断分数值,如果执行简单强制转换,则可能会发生这种情况。
例如,如果您使用简单的强制转换将RGB-16值直接转换为RGB-8,如下所示:

RGB8 = uint8(RGB16/257); % Incorrect

字符串
由于强制转换会截断小数部分,因此可能会丢失一些信息。
现在,让我们解决问题的JavaScript部分。你在JavaScript中使用的方法并不完全正确。要在JavaScript中将RGB-16值转换为RGB-8,您需要缩放值并确保它们在有效范围(0-255)内。
这里有一个正确的方法来做到这一点:

// Assuming RGB16 is an array of RGB-16 values (e.g., [r, g, b])
const RGB16 = [65535, 32768, 49152]; // Example RGB-16 values

// Convert RGB-16 to RGB-8
const RGB8 = RGB16.map(value => Math.round(value / 257));

console.log(RGB8); // Output: [ 255, 128, 192 ]

相关问题