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
相关产品推荐
相关产品推荐

