2011-07-15 6 views
2

J'essaie de créer une image à partir d'un tableau d'octets. Le tableau d'octets est créé par un scanner d'empreintes digitales (cf. méthode CaptureFrame). fwidth est 256 et fheight est 255.Image.FromStream: Paramètre non valide

Quand je lance le code ci-dessous, je reçois

System.ArgumentException: Paramètre non valide.

Dim fWidth As Short 
Dim fHeight As Short 

DFRProxy.DFRProxy.GetImageDimensions(fWidth, fHeight) 

Dim imgBufLength As Integer = CInt(fWidth) * fHeight 

Dim finger(imgBufLength) As Byte 

Dim startCap As Short = DFRProxy.DFRProxy.StartCapture(0) 

Dim capFrame As Short = DFRProxy.DFRProxy.CaptureFrame(0, finger, 0) 


Using ms As New IO.MemoryStream(finger) 
    thisImage = Image.FromStream(ms) 
End Using 

l'erreur se produit à la ligne

thisImage = Image.FromStream(ms) 

Le tableau d'octets a 65280 éléments. J'ai passé en revue plusieurs publications StackOverflow similaires, mais rien n'a fonctionné. J'ai essayé de définir les paramètres useEmbeddedColorManagement et validateImageData pour la méthode FromStream à False et True, mais cela ne résout pas le problème.

Avez-vous des suggestions sur la façon de corriger le ArgumentException?

Répondre

6

FromStream attend des données dans l'un de ces formats:

Managed GDI + a des codeurs intégrés et les décodeurs qui prennent en charge les types de fichiers suivants:

BMP 

GIF 

JPEG 

PNG 

TIFF 

Votre tableau d'octets Je soupçonne n'est pas dans ceux-ci et n'a pas les informations de métadonnées ou de compression attendues de chacun de ces formats. Ce que vous voulez faire est de créer un objet bitmap et lire chaque pixel dans le tableau d'octets, en appelant SetPixel dans le bitmap pour le pixel approprié. Vous allez vous retrouver avec un bitmap (qui est une image) qui a les pixels que vous voulez.

+0

excellent. Merci. C'est une image en niveaux de gris. Lorsque j'utilise la méthode SetPixel, comment puis-je convertir la valeur en niveaux de gris (0-255) en une couleur système? – blueshift

+1

Si la valeur est v, la nouvelle couleur (v, v, v) devrait faire l'affaire (crée une couleur avec des composants RVB égaux, ce qui devrait être gris) – antlersoft

+0

Cela l'a fait. Merci pour l'excellente réponse. Cela m'a rendu fou pendant des heures. – blueshift

4

Effectuez les opérations suivantes:

TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(byteArray); 
0

En plus de> ggsmartboy réponse pour VB.NET:

En plus du module/classe/form

Imports system.componentmodel 

Dans le code

Dim ba As New Byte() 'Make sure you set the byte array to something 
Dim tc As TypeConverter = TypeDescriptor.GetConverter(GetType(Bitmap)) 
Dim bmp As Bitmap = tc.ConvertFrom(ba) 

Et par la suite:

PictureBox1.Image = bmp 

Vive

Questions connexes