如何将 RGB-16 调色板批量转换为 RGB-8 并支持多组调色板复用

2次阅读

如何将 RGB-16 调色板批量转换为 RGB-8 并支持多组调色板复用

本文介绍一种安全、可扩展的 javascript 实现方式,通过对象字面量管理多个调色板数组,并在通用转换函数中按名称动态访问,避免传入字符串却误当数组使用的常见错误。

在将高精度 RGB-16(16 位每通道,取值范围 0–65535)颜色值降级为标准 RGB-8(8 位每通道,0–255)时,核心换算逻辑是:math.round(value / 257) —— 因为 65535 ÷ 255 = 257,该除法可精准映射整个 16 位范围到 8 位整数空间。

但原始代码存在一个关键类型错误:

convert('system41'); // 传入的是字符串 'system41' // 而函数内却执行: palette.foreach(...) // ❌ 字符串没有 forEach 方法!

这会导致 TypeError: palette.forEach is not a function

✅ 正确做法是分离“数据”与“标识符:将所有调色板统一存入一个对象,键为名称(如 ‘system41’),值为对应二维数组。函数接收字符串参数后,通过方括号属性访问(palettes[palette])获取真实数组:

const palettes = {   system41: [     [65535, 65535, 65535],     [64512, 62333,  1327],     [65535, 25738,   652]   ],   system7: [     [65535, 65535, 52428],     [65535, 52428, 39321],     [52428, 39321, 26214]   ] };  function convert(paletteName) {   const targetPalette = palettes[paletteName];   if (!targetPalette) {     console.warn(`调色板 "${paletteName}" 未定义`);     return;   }    targetPalette.forEach((rgb16) => {     const rgb8 = rgb16.map(v => Math.round(v / 257));     document.querySelector(`#${paletteName}`).innerhtml += rgb8.join(', ') + 'n';   }); }  convert('system41'); convert('system7');

? 注意事项:

  • 确保 HTML 中存在对应 ID 的容器,例如

  • 添加存在性校验(if (!targetPalette))可提升健壮性,避免因拼写错误导致静默失败;
  • 若需多次调用且不希望内容累加,建议先清空 innerHTML = ”,或使用 textContent 配合数组 join(‘n’) 批量渲染,更高效安全。

这种设计既保持函数单一职责(只做转换与渲染),又通过数据驱动实现灵活扩展——新增调色板只需向 palettes 对象添加新键值对,无需修改函数逻辑。

text=ZqhQzanResources