我正在尝试创建一个程序,用于从Lua中删除Web中的图像。一个小问题是图像有时没有扩展名或不正确的扩展名。看到这个动画" jpeg"例如:http://i.imgur.com/Imvmy6C.jpg
所以我创建了一个检测图像文件类型的函数。它非常简单,只需比较返回图像的前几个字符即可。 Png文件以PNG开头,GIF用GIF开头,JPG用奇怪的符号开头#34;╪"。
由于图像不应该表示为字符串,所以它有点hacky,但它工作得很好。除非我实际运行代码。当我将代码输入命令行时,它可以正常工作。但是当我运行包含代码的文件时,它不起作用。 Weirder,它只能在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"正确。将其作为文件运行会返回" unknown"。
我在Windows 8.1中使用Lua for Windows软件包中的Lua 5.1.4,通过PowerShell。
编辑:
发现问题string.byte("╪")在命令行中返回216,在作为文件运行时返回226。我不知道为什么,对于lua和powershell可能有不同的编码?
这一行解决了这个问题:
if string.byte(string.sub(image, 2, 2)) == 216 then imageType = "jpg" end
答案 0 :(得分: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))