2010-09-16 3 views
2

Ceci est une application C# Winforms dans .NET 4.0.Comment gérer les erreurs lors de la conversion d'un tableau d'octets en image?

Je reçois un tableau d'octets d'un serveur Web qui est supposé être une image JPG. Je convertir ce tableau à une image comme suit:

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

Très souvent, les données reçues n'est pas une image, mais les déchets de quelque sorte. Je préférerais vraiment une sorte d'approche TryParse, car je comprends la manipulation de la logique en utilisant l'attraper des exceptions pour être moins que souhaitable.

Comment est-ce que je peux améliorer cette méthode pour déterminer proprement si un tableau d'octets peut être converti en image sans compter sur une exception?

EDIT:

Sur la base de la réponse de Mikael, je vérifie maintenant les deux premiers octets pour un « contrôle de santé d'esprit » rudimentaire avant d'essayer de convertir l'image. Il est toujours possible d'avoir un flux de données invalide, mais comme je reçois habituellement du texte à la place d'une image, la vérification de l'en-tête réduira considérablement la fréquence de l'exception.

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

Répondre

1

Vous pouvez vérifier les premiers octets pour valider l'en-tête au moins.

octet 1-2: 0xFFD8

octet 3-4: largeur de pixel

octet 5-6: hauteur de pixel

si ceux-ci sont vous êtes sur votre chemin sensible.

En ce qui concerne l'utilisation d'une exception pour gérer les erreurs, je ne pense pas que cela devrait poser problème. Vous ne gérez que l'erreur particulière, et pour une raison.

+0

Ceci est extrêmement utile. Il permettra de réduire le nombre de fois que l'exception se produit (si ce n'est pas toujours) en faisant un peu de vérification de santé mentale préliminaire. Merci pour la suggestion! – JYelton

1

Vous ne pouvez pas, au moins pas sans un travail important. Il n'y a pas de Bitmap.TryParse.

Vous pouvez regarder les en-têtes des données d'octets et voir si elles ressemblent à un fichier JPG. Mais même alors, il est possible de recevoir des ordures.

Je recommande de rester dans votre approche actuelle.

+0

En regardant les en-têtes, vous réduirez la fréquence à laquelle je dois me fier à l'exception. Le gestionnaire d'exception restera bien sûr mais une vérification préalable est idéale. – JYelton

0

Votre code a l'air bien. Vous supposez que les octets sont une image valide, donc s'ils ne le sont pas, la situation est vraiment "exceptionnelle" ...

Questions connexes