web-dev-qa-db-fra.com

Difficulté à enregistrer une image dans MemoryStream

J'ai des difficultés à enregistrer un flux d'octets d'une image (dans ce cas, un jpg) dans un objet System.IO.MemoryStream. Le but est d’enregistrer le System.Drawing.Image dans une MemoryStream, puis d’utiliser la MemoryStream pour écrire l’image dans un tableau d’octets (j’ai besoin de l’insérer dans une base de données). Cependant, l'inspection de la variable data après la fermeture de la MemoryStream montre que tous les octets sont nuls ... Je suis plutôt perplexe et je ne suis pas sûr de savoir où je me trompe ...

using (Image image = Image.FromFile(filename))
{
    byte[] data;

    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        data = new byte[m.Length];
        m.Write(data, 0, data.Length);
    }

    // Inspecting data here shows the array to be filled with zeros...
}

Toute idée sera très appréciée!

15
Andrew

Pour charger les données d'un flux dans un tableau, vous lisez , pas écrivez (et vous auriez besoin de revenir en arrière). Mais, plus simplement dans ce cas, ToArray():

using (MemoryStream m = new MemoryStream())
{
    image.Save(m, image.RawFormat);
    data = m.ToArray();
}
29
Marc Gravell

Si le but est de sauvegarder les octets de l'image dans une base de données, vous pouvez simplement faire:

byte[] imgData = System.IO.File.ReadAllBytes(@"path/to/image.extension");

Et branchez ensuite la logique de votre base de données pour sauvegarder les octets.

4
Icarus

Essayez de cette façon, ça marche pour moi

                MemoryStream ms = new MemoryStream();
                Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
                panel1.DrawToBitmap(bmp, panel1.Bounds);
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] Pic_arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(Pic_arr, 0, Pic_arr.Length);
                ms.Close();

Bien au lieu d'un contrôle d'image, j'ai utilisé un contrôle de panneau.

0
Leinad

J'ai trouvé pour une autre raison cet article il y a quelques secondes, vous le trouverez peut-être utile: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

En gros, je ne comprends pas pourquoi vous essayez d'écrire un tableau vide sur un flux de mémoire contenant une image. Est-ce votre façon de nettoyer l'image?

Si ce n'est pas le cas, lisez ce que vous avez écrit dans votre méthode memorystream with ToArray et affectez-le à votre tableau d'octets.

Et c'est tout

0
Fire-Dragon-DoL