Convertir en Tableau d'Octets de l'Image: Paramètre n'est pas valide
Je suis de stocker des images dans une base de données et que vous souhaitez convertir de tableau d'octets de l'image. Je n'ai pas de problème de conversion d'un objet de tableau d'octets, mais j'obtiens une erreur "Paramètre n'est pas valide" lorsque vous essayez de convertir à partir du tableau d'octets de l'image. L'objet que je transmets à ma méthode est à partir d'un dataset ligne.
Procédure stockée
USE [----------------]
GO
/****** Object: StoredProcedure [dbo].[usp_imageloader_add_test] Script Date: 01/16/2012 09:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_imageloader_add_test]
@p_Image Image
as
INSERT into Test_Images VALUES(@p_Image)
Télécharger le Fichier de contrôle /convertir le fichier de l'Image du tableau d'octets et d'enregistrer les données dans la base de données
protected void btnUpload_Click(object sender, EventArgs e)
{
if (ctrlUpload.PostedFile != null)
{
if (ctrlUpload.PostedFile.ContentLength > 0)
{
//Get Posted File
HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile;
//Find its length and convert it to byte array
int ContentLength = objHttpPostedFile.ContentLength;
//Create Byte Array
byte[] bytImg = new byte[ContentLength];
//Read Uploaded file in Byte Array
objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength);
using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
{
try
{
string sql = "usp_imageloader_add_test";
SqlCommand cmd = new SqlCommand(sql, dbConnection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Image;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
catch (Exception ex)
{
ex.Message.ToString();
}
}
}
}
}
Convertit l'objet en tableau d'octets et de l'image
private System.Drawing.Image ObjToImg(object obj)
{
byte[] byteArray;
if (obj == null)
return null;
else
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
byteArray = ms.ToArray(); //Byte Array
ms.Close();
ms = new MemoryStream(byteArray, 0, byteArray.Length);
ms.Seek(0, SeekOrigin.Begin);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
return returnImage;
}
Toutes les idées seraient utiles.
stackoverflow.com/a/6712677/284240 sauvegarder les données binaires dans un fichier et de voir comment un éditeur d'image répond
OriginalL'auteur nick gowdy | 2012-01-13
Vous devez vous connecter pour publier un commentaire.
Image.FromStream
est probablement jeter unArgumentException
parce que le format de l'image n'est pas valide. Attend un hasard objet sérialisé à être formaté comme une image valide, n'est pas raisonnable.Vous ne devriez pas être la sérialisation, il ne fait aucun sens. Si le paramètre est venu à partir de l'ensemble de données, il devrait déjà être un tableau de type byte.
OriginalL'auteur insipid
Est les données que vous êtes en utilisant des données RVB? Si donc, il y a un utilisateur commentaires dans les docs pour FromStream() qui mentionne que la méthode va jeter si le flux contient des données RVB: http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx (voir en bas de la page); il recommande l'utilisation d'une image au lieu (http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx).
OriginalL'auteur atkretsch
Essayez ce qui suit, le flux ne peut pas être initialisé au début:
Ce type d'image est-il? Êtes-vous sûr que l'image qui est stockée est-elle valable?
Aussi juste un commentaire sur l'utilisation (n'influe pas sur la question), il est de bonne pratique d'utiliser
using
déclaration lorsque l'on travaille avec des cours d'eau. Par exemple:Ok je vais essayer cela et voir si cela fonctionne.
J'ai modifié le code de certains le flux vers le début avant d'essayer de dessiner l'image de la memorystream et ça en jette toujours la même erreur.
gowdy Ce type d'image est-il? Avez-vous vérifié que l'image qui est stockée est-elle valable?
OriginalL'auteur Kelsey
La solution par Kelsey devrait fonctionner. C'est parce que, quand vous lisez les données de l'objet byteArray de flux de mémoire, le pointeur est placé à la fin du flux, et maintenant, quand vous essayez de lire des données à partir de ce flux de mémoire, il essaie de lire à la tête de ce pointeur, et comme il n'y a pas de données après cela, vous obtiendrez une erreur. Maintenant, si vous ne
ms.Seek(0, SeekOrigin.Begin);
, le lecteur pointeur est placé au début de la flux de mémoire. Et de disposer de flux de mémoire lorsque vous avez terminé de l'utiliserms.Dispose()
. Espérons que cette aide.OriginalL'auteur Amar Palsapure
Vous n'avez pas besoin du module de formatage binaire, c'est ce qui est de jouer avec vos données, c'est pour la sérialisation des objets vraiment.
La clé de chose à noter est que l'objet est un tableau d'octets déjà de sorte que vous pouvez simplement le jeter et de les utiliser.
Essayez ceci:-
OriginalL'auteur