Как мне обрабатывать ошибки при преобразовании байтового массива в изображение? - PullRequest
2 голосов
/ 16 сентября 2010

Это приложение C # Winforms в .NET 4.0.

Я получаю байтовый массив с веб-сервера, который должен быть изображением 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 подход, так как я понимаю, что логика обработки с использованием перехвата исключений меньше желаемого.

Как я могу улучшить этот метод, чтобы точно определить, можно ли преобразовать байтовый массив в изображение, не полагаясь на исключение?

EDIT:

Основываясь на ответе Микаэля, я сейчас проверяю первые два байта на элементарную «проверку здравомыслия», прежде чем пытаться преобразовать изображение. Все еще возможно иметь неверный поток данных, но, поскольку я обычно получаю текст вместо изображения, проверка заголовка значительно уменьшит частоту исключения.

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

1 голос
/ 16 сентября 2010

Вы можете проверить первые байты, чтобы проверить заголовок как минимум.

байт 1-2: 0xFFD8

байт 3-4: ширина пикселя

байт 5-6: высота пикселя

если это разумно, вы находитесь на своем пути.

Что касается использования исключения для обработки ошибок, я не думаю, что это должно бытьпроблема.Вы обрабатываете только конкретную ошибку, и по причине.

1 голос
/ 16 сентября 2010

Вы не можете, по крайней мере, без значительной работы. Нет Bitmap.TryParse.

Вы можете посмотреть на заголовки байтовых данных и посмотреть, выглядит ли это как JPG. Но даже тогда можно получить мусор.

Я рекомендую придерживаться вашего текущего подхода.

0 голосов
/ 16 сентября 2010

Ваш код выглядит нормально.Вы предполагаете, что байты являются допустимым изображением, поэтому если это не так, то ситуация действительно «исключительная» ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...