【发布时间】:2014-09-25 19:11:16
【问题描述】:
我正在尝试创建一个在 Lua 中从网络上抓取图像的程序。一个小问题是图像有时没有扩展名或扩展名不正确。请参阅此动画“jpeg”,例如:http://i.imgur.com/Imvmy6C.jpg
所以我创建了一个函数来检测图像的文件类型。这很简单,只需比较返回图像的前几个字符即可。 Png 文件以 PNG 开头,GIF 以 GIF 开头,JPG 以奇怪的符号“╪”开头。
这有点笨拙,因为图像不应该被表示为字符串,但它工作得很好。除非我实际运行代码。
当我在命令行中输入代码时,它工作正常。但是当我运行一个包含代码的文件时,它不起作用。更奇怪的是,它只在 jpeg 上失败。它仍然可以正确识别 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
【问题讨论】:
-
您的示例图像是动画 GIF,而不是 JPEG。至少 IE 是这么说的。代码本身中的那个是 JPG 好吧...
-
这是一个扩展名错误的文件示例。有人对其进行了编辑,但最初它是指向 .jpg 的链接,实际上是 .gif。