2

我正在尝试创建一个在 Lua 中从网络上抓取图像的程序。一个小问题是图像有时没有扩展名或扩展名不正确。请参阅此动画“jpeg”,例如:http: //i.imgur.com/Imvmy6C.jpg

所以我创建了一个函数来检测图像的文件类型。这很简单,只需比较返回图像的前几个字符即可。Png 文件以 PNG 开头,GIF 以 GIF 开头,JPG 以奇怪的符号“╪”开头。

这有点 hacky,因为图像不应该被表示为字符串,但它工作得很好。除非我实际运行代码。

当我将代码输入命令行时,它工作正常。但是当我运行一个包含代码的文件时,它不起作用。更奇怪的是,它只在jpegs上失败。它仍然可以正确识别 PNG 和 GIF。

这是重现该错误所需的最少代码:

http = require "socket.http"
function detectImageType(image)
    local imageType = "unknown"
    if string.sub(image, 2, 2) == "╪" then imageType = "jpg" end
    return imageType
end
image = http.request("http://i.imgur.com/T4xRtBh.jpg")
print(detectImageType(image))

将其复制并粘贴到命令行中会正确返回“jpg”。将其作为文件运行会返回“未知”。

我在 Windows 8.1 上通过 powershell 使用 Lua for Windows 包中的 Lua 5.1.4。

编辑:

发现问题 string.byte("╪") 在命令行返回 216,作为文件运行时返回 226。我不知道为什么,也许 lua 和 powershell 的编码不同?

这一行解决了这个问题:

if string.byte(string.sub(image, 2, 2)) == 216 then imageType = "jpg" end
4

1 回答 1

4

我认为这是因为当您保存文件时,您将其保存为不同的编码,因此 ╪ 字符可能会转换为另一个字符。将其转换为字节码更健壮:

http = require "socket.http"
function detectImageType(image)
    local imageType = "unknown"
    if string.byte(image, 2) == 216 then imageType = "jpg" end
    return imageType
end
image = http.request("http://i.imgur.com/T4xRtBh.jpg")
print(detectImageType(image))
于 2014-08-02T22:32:06.517 回答