2011-12-01 122 views
17

我知道没有用于检查的.Net函数,但是在使用字节数组之前,有没有一种检查字节是否有效的算法或简单有效的方法。我需要这样做是因为我向不断收听客户端的服务器发送不同的命令,其中一个命令是获取服务器计算机的屏幕截图。如何检查字节数组是否是有效的图像?

+0

每个图像都有一个特定格式的标题。你可以随时检查。 –

回答

27

您可以尝试从字节数组中生成图像,并检查其是否为ArgumentException

public static bool IsValidImage(byte[] bytes) 
{ 
    try { 
     using(MemoryStream ms = new MemoryStream(bytes)) 
      Image.FromStream(ms); 
    } 
    catch (ArgumentException) { 
     return false; 
    } 
    return true; 
} 
+8

我认为这不符合“在我使用字节数组之前检查” –

8

如上所述,试图将其加载到映像中是唯一的故障安全方式。您可以根据[预期]图像类型检查magick编号aka文件标题。例如,* .png文件的前8个字节是,在十六进制:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

大多数其他类型的图像文件也有类似的magick号码。

但是检查,实际上不会告诉你,如果该文件是一个有效的图像文件。所有你会知道的是,这个magick数似乎表明它是一个X类型的文件。它仍然可能被截断或者被破坏,甚至是完全不同的东西,只是碰巧有正确的八位字节序列正确的位置。

2

对于JPEG,您可以检查前两个字节是0xFF,0xD8,最后两个字节是0xFF,0xD9。当然,它的图像数据仍然可能与EOI标签相匹配,但这应该很少见。

-1

据我,如果你想只图像输入(正确的图像),那么你就应该接受这样的输入域的属性去:

输入类型=“文件” NAME =“UploadedFile的” ID =” imageContent“class =”required“accept =”image/*“/>

这会给你输入图像。所以,你可以自由编码后端。不用担心图像是否有效。

而且,即使你要喜欢,你可以指定特定的图像类型:

输入类型= “文件” NAME = “UploadedFile的” ID = “imageContent” 级= “需要” 接受=“图像/ JPEG,图像/ gif,image/png“>

+0

这假定用户是一个非恶意用户,浏览器正确支持这些属性,还有其他一些事情要考虑。总是尽可能地保护您的后端,因为客户端验证令人遗憾地不可靠。 –