web-dev-qa-db-fra.com

BitmapImage en octet []

J'ai un BitmapImage que j'utilise dans une application WPF, je veux plus tard l'enregistrer dans une base de données sous forme de tableau d'octets (je suppose que c'est la meilleure façon), comment puis-je effectuer cette conversion?

Ou bien, existe-t-il une meilleure façon d'enregistrer un BitmapImage (ou l'une de ses classes de base, BitmapSource ou ImageSource) dans un référentiel de données?

35
So Many Goblins

Pour convertir en octet [], vous pouvez utiliser un MemoryStream:

byte[] data;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
using(MemoryStream ms = new MemoryStream())
{
    encoder.Save(ms);
    data = ms.ToArray();
}

Au lieu du JpegBitmapEncoder, vous pouvez utiliser tout BitmapEncoder que vous aimez, comme l'a dit casperOne.

Si vous utilisez MS SQL, vous pouvez également utiliser une colonne image- car MS SQL prend en charge ce type de données, mais vous devrez toujours convertir BitmapImage d'une manière ou d'une autre.

54
ChrFin

Vous devrez utiliser une instance d'une classe qui dérive de BitmapEncoder (comme BmpBitmapEncoder ) et appeler Save méthode pour enregistrer le BitmapSource dans un Stream.

Vous choisiriez l'encodeur spécifique en fonction du format dans lequel vous souhaitez enregistrer l'image.

5
casperOne

l'écrire dans un MemoryStream, vous pouvez alors accéder aux octets à partir de là. quelque chose comme ça:

public Byte[] ImageToByte(BitmapImage imageSource)
{
    Stream stream = imageSource.StreamSource;
    Byte[] buffer = null;
    if (stream != null && stream.Length > 0)
    {
        using (BinaryReader br = new BinaryReader(stream))
        {
            buffer = br.ReadBytes((Int32)stream.Length);
        }
    }

    return buffer;
}
0
Muad'Dib