读取24位位图的宽度/高度。

我正在学习并尝试解析 BMP 文件,但我该如何将宽度/高度数据转换为正确的数字?我将字节转换为十进制数,但它们以奇怪的格式出现。

例如,宽度为 3 的图像变成了 3 0 0 0,但宽度为 400 的图像变成了 144 1 0 0。

    local HexPaste = [[
    424d 480e 0000 0000 0000 3600 0000 2800
0000 9001 0000 0300 0000 0100 1800 0000
0000 120e 0000 120b 0000 120b 0000 0000
0000 0000 0000 3333 3333 3333 3333 3333
3333 3333 3333 3333 3333
]] --去掉了一堆像素数据,因为目前并不重要

function Compress(Hex)
    local returnString = {}
    for s in string.gmatch(Hex,'%x') do
        table.insert(returnString,#returnString+1,s)
    end
    returnString = table.concat(returnString,'')
    return returnString
end

function Read(Hex,Type,ByteA,ByteB)
    local STable = {}
    for s = ByteA,ByteB do
        if Type == 'Text' then
            table.insert(STable,#STable+1,string.char(tonumber(string.sub(Hex,(s*2)-1,s*2),16)))
        elseif Type == 'Deci' then
            table.insert(STable,#STable+1,tonumber(string.sub(Hex,(s*2)-1,s*2),16))
        end
    end
    return table.concat(STable,'')
end

function ReadFile(Hex)
    Hex = Compress(Hex)
    if Read(Hex,'Text',1,2) == 'BM' then
        local Width = Read(Hex,'Deci',19,22)
        local Height = Read(Hex,'Deci',23,26)
        print('该文件为 '..Width..'x'..Height)
    else
        error('文件类型不正确')
    end
end

ReadFile(HexPaste)
点赞
用户1847592
用户1847592
function Compress(Hex)
   return (Hex:gsub('%X',''))
end

function Read(Hex,Type,ByteA,ByteB)
   Hex = Hex:sub(2*ByteA-1,2*ByteB)
   if Type == 'Text' then
      return (Hex:gsub('..',function(h)return h.char(tonumber(h,16))end))
   elseif Type == 'Deci' then
      local v = 0
      Hex:reverse():gsub('(.)(.)',function(b,a)v=v*256+tonumber(a..b,16)end)
      return v
   end 
end

将十六进制压缩的函数命名为“Compress”,函数接受一个十六进制字符串作为参数,返回一个新的字符串,其中所有非十六进制字符都被移除。

将函数命名为“Read”,函数接受四个参数:一个十六进制字符串,一个字符串类型(“Text”或“Deci”),一个起始字节索引和一个终止字节索引。根据给定的起始和终止字节索引截取字符串。如果类型为“Text”,则将字符串中的每两个十六进制字符转换为一个字符;如果类型为“Deci”,则将字符串中的每两个十六进制字符组成一个字节(以反向顺序排列)并转换为十进制。最后返回相应类型的值。

2014-08-30 16:47:59