Imagen de BIT a byte[]


Tengo un BitmapImage que estoy usando en una aplicación WPF, luego quiero guardarlo en una base de datos como una matriz de bytes (supongo que es la mejor manera), ¿cómo puedo realizar esta conversión?

O, alternativamente, ¿hay una mejor manera de guardar un BitmapImage (o cualquiera de sus clases base, BitmapSource o ImageSource) en un repositorio de datos?

Author: casperOne, 2011-07-06

4 answers

Para convertir a un byte [] puede usar 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();
}

En lugar del JpegBitmapEncoder puede usar cualquier BitmapEncoder que desee, como dijo casperOne.

Si está utilizando MS SQL, también podría usar una columna image ya que MS SQL admite ese tipo de datos, pero aún tendría que convertir la imagen de bits de alguna manera.

 52
Author: ChrFin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 14:18:56

, Usted tendrá que usar una instancia de una clase que deriva de BitmapEncoder (como BmpBitmapEncoder) y llamar a la Save método para guardar el BitmapSource a a Stream.

Usted elegiría el codificador específico dependiendo del formato en el que desea guardar la imagen.

 5
Author: casperOne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 14:13:22

Escríbalo en un MemoryStream, luego puede acceder a los bytes desde allí. algo como esto:

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
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 14:04:51

Simplemente use un MemoryStream.


byte[] data = null;

using(MemoryStream ms = new MemoryStream())
{
    bitmapImage.Save(ms);
    data = ms.ToArray();
}


 -5
Author: bdowden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 14:08:23