Je veux convertir un tableau d'octets en image.
C'est mon code de base de données à partir duquel j'obtiens le tableau d'octets:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Mon code de conversion:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Lorsque j'atteins la ligne avec un commentaire, l'exception suivante se produit: Parameter is not valid.
Comment puis-je corriger ce qui cause cette exception?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
la source
la source
Réponses:
Vous écrivez deux fois dans votre flux mémoire, et vous ne supprimez pas non plus le flux après utilisation. Vous demandez également au décodeur d'image d'appliquer une correction de couleur intégrée.
Essayez plutôt ceci:
la source
Peut-être que je manque quelque chose, mais pour moi, ce one-liner fonctionne bien avec un tableau d'octets qui contient une image d'un fichier JPEG.
ÉDITER:
Voir ici pour une version mise à jour de cette réponse: Comment convertir une image dans un tableau d'octets
la source
la source
Je voudrais noter qu'il y a un bogue dans la solution fournie par @ isaias-b.
Cette solution suppose qu'elle
stride
est égale à la longueur de la ligne. Mais ce n'est pas toujours vrai. En raison des alignements de mémoire effectués par GDI, la foulée peut être supérieure à la longueur de ligne. Cela doit être pris en compte. Sinon, une image décalée invalide sera générée. Les octets de remplissage dans chaque ligne seront ignorés.Code fixe:
Pour illustrer ce à quoi cela peut conduire, générons une
PixelFormat.Format24bppRgb
image dégradée 101x101:Si nous copions tout le tableau tel quel à l'adresse pointée par
bmpData.Scan0
, nous obtiendrons l'image suivante. Décalage d'image parce qu'une partie de l'image a été écrite dans les octets de remplissage, qui a été ignoré C'est aussi pourquoi la dernière ligne est incomplète:Mais si nous copions le pointeur de destination de décalage ligne par ligne par
bmpData.Stride
valeur, une image valide sera générée:La foulée peut également être négative:
Mais je n'ai pas travaillé avec de telles images et c'est au-delà de ma note.
Réponse associée: C # - Tampon RVB de Bitmap différent de C ++
la source
Toutes les réponses présentées supposent que le tableau d'octets contient des données dans une représentation de format de fichier connue, comme: gif, png ou jpg. Mais j'ai récemment eu un problème en essayant de convertir
byte[]
efficacement des s, contenant des informations BGRA linéarisées, enImage
objets. Le code suivant le résout à l'aide d'unBitmap
objet.Ceci est une légère variation d'une solution qui a été publiée sur ce site .
la source
il y a une approche simple comme ci-dessous, vous pouvez utiliser la
FromStream
méthode d'une image pour faire l'affaire, n'oubliez pas d'utiliserSystem.Drawing
;la source
essayez (UPDATE)
la source
Vous n'avez pas déclaré returnImage comme une sorte de variable :)
Cela devrait aider:
la source
Ceci est inspiré de la réponse de Holstebroe, ainsi que des commentaires ici: Obtenir un objet Image à partir d'un tableau d'octets
la source
Bon mot:
la source
La plupart du temps, lorsque cela se produit, ce sont des données incorrectes dans la colonne SQL. C'est la bonne façon d'insérer dans une colonne d'image:
La plupart des gens ne le font pas correctement de cette façon:
la source
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
la source