将字节数组转换为图像时如何处理错误?

时间:2010-09-16 17:40:32

标签: .net image-processing exception-handling

这是.NET 4.0中的C#Winforms应用程序。

我从Web服务器接收一个字节数组,该服务器应该是JPG图像。我将此数组转换为图像,如下所示:

// 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...

3 个答案:

答案 0 :(得分:1)

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

您可以查看字节数据的标题,看看它是否看起来像JPG。但即便如此,也有可能收到垃圾。

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

答案 1 :(得分:1)

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

  

字节1-2:0xFFD8

     

字节3-4:像素宽度

     

字节5-6:像素高度

如果这些是明智的,那么你就在路上。

至于使用异常来处理错误,我认为不应该是一个问题。您只处理特定错误,并且有理由。

答案 2 :(得分:0)

您的代码看起来很好。你假设字节是一个有效的图像,所以如果它们不是,那么情况真的是“特殊的”......