You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LuaU自定义SubStr函数读取颜色值时偏移异常问题排查

问题原因分析及修复方案

核心问题1:颜色数据起始位置计算错误

前面的BitDepth、Width、Height三个字段总共占用 8*3=24 位,第一个颜色的RED通道应该从第25位开始读取,但你的代码用24*i作为起始位置:

  • 当i=1时,起始位置是24,刚好是Height字段的最后一位,导致读取内容混入了Height的末尾位和颜色数据的前7位,直接引发偏移。

核心问题2:循环内错误重置颜色表

每次循环都执行Image["Colours"] = {},会清空之前存储的所有颜色数据,最终Image["Colours"]里只会保留最后一次循环的颜色值。

核心问题3:颜色块的步长计算错误

每个颜色包含RGBA四个通道,每个通道8位,总共占用8*4=32位。你按24位步长计算下一个颜色的位置,会导致后续颜色的读取位置持续偏移。


修复后的调用代码

print("BitDepth", SubStr(Text, 1, 8))
print("Width", SubStr(Text, 9, 8))
print("Height", SubStr(Text, 17, 8))

Image["BitDepth"] = tonumber(SubStr(Text, 1, 8), 2)
Image["Width"] = tonumber(SubStr(Text, 9, 8), 2)
Image["Height"] = tonumber(SubStr(Text, 17, 8), 2)

-- 初始化颜色表只执行一次
Image["Colours"] = {}
local colourStart = 25 -- 前24位是基础字段,颜色从第25位开始
for i = 1, Image["BitDepth"] do
    Image["Colours"][i] = {}
    
    local redPos = colourStart + (i-1)*32
    print("RED", SubStr(Text, redPos, 8))
    print("BLUE", SubStr(Text, redPos + 8, 8))
    print("GREEN", SubStr(Text, redPos + 16, 8))
    print("ALPHA", SubStr(Text, redPos + 24, 8))
    
    -- 可选:将解析后的值存入表中
    Image["Colours"][i].RED = tonumber(SubStr(Text, redPos, 8), 2)
    Image["Colours"][i].BLUE = tonumber(SubStr(Text, redPos + 8, 8), 2)
    Image["Colours"][i].GREEN = tonumber(SubStr(Text, redPos + 16, 8), 2)
    Image["Colours"][i].ALPHA = tonumber(SubStr(Text, redPos + 24, 8), 2)
end

验证效果

以你提供的二进制字符串为例,修复后i=1时:

  • RED读取25-32位:11111111
  • BLUE读取33-40位:11111111
  • GREEN读取41-48位:11111111
  • ALPHA读取49-56位:00000000(如果预期ALPHA也为全1,需要检查二进制字符串的对应部分是否正确)

内容的提问来源于stack exchange,提问作者oofsamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:24:19