2010-09-16 13 views
2

这是.NET 4.0中的C#Winforms应用程序。如何在将字节数组转换为图像时处理错误?

我从一个应该是JPG图像的Web服务器接收一个字节数组。我这个数组转换为图像如下:

// byte[] ImageData ... 
bool ValidImage = false; 
try 
{ 
    MemoryStream ms = new MemoryStream(ImageData); 
    Bitmap FinalImage = new Bitmap(ms); 
    ValidImage = true; 
} 
catch (ArgumentException) 
{ 
    ImageStatus = "Invalid"; 
} 
if (ValidImage) // do stuff... 

很多时候接收到的数据是不是某种类型的图像,但垃圾。我真的更喜欢某种TryParse的方法,因为我明白通过使用异常捕获来处理逻辑并不理想。

我该如何改进这种方法来干净地确定字节数组是否可以转换为图像而不依赖于异常?

编辑:

基于的Mikael的回答,我现在检查一个基本的“健康检查”的前两个字节试图将图像转换之前。仍然可能有无效的数据流,但由于我通常会接收文本而不是图像,因此标头检查将大大降低异常的频率。

// byte[] ImageData ... 
bool ValidImage = false; 
try 
{ 
    if (ImageData[0] == 0xFF && ImageData[1] == 0xD8) 
    { 
     MemoryStream ms = new MemoryStream(ImageData); 
     Bitmap FinalImage = new Bitmap(ms); 
     ValidImage = true; 
    } 
} 
catch (ArgumentException) 
{ 
    ImageStatus = "Invalid"; 
} 
if (ValidImage) // do stuff... 

回答

1

您可以至少检查第一个字节以验证标头。

字节1-2:0xFFD8

字节3-4:像素宽度

字节5-6:像素高度

,如果这些是明智的,你对你的方式。

至于使用异常来处理错误,我不认为这应该是一个问题。你只处理特定的错误,并有一个原因。

+0

这非常有用。它会通过做一些初步的完整性检查来减少异常发生的次数(如果不是总是如此)。感谢您的建议! – JYelton 2010-09-16 18:03:18

1

你不能,至少不是没有一些重要的工作。没有Bitmap.TryParse。

您可以查看字节数据的标题并查看它是否看起来像JPG。但即使这样也有可能收到垃圾。

我建议坚持你目前的做法。

+0

查看标题将有助于减少我需要依赖于例外的频率。异常处理程序当然会保留,但一些初步检查是理想的。 – JYelton 2010-09-16 18:04:23

0

你的代码看起来不错。你认为这些字节是一个有效的图像,所以如果他们不是那么情况是真的'例外'...

相关问题