Pregunta

Estoy tratando de pasar alguna representación de una imagen de ida y vuelta entre Silverlight y un servicio WCF. Si es posible me gustaría pasar una System.Windows.Media.Imaging.BitmapImage, ya que eso significaría que el cliente no tiene que realizar ninguna conversión.

Sin embargo, en algún momento necesito para almacenar esta imagen en una base de datos, es decir, la representación de la imagen debe ser capaz de convertir desde y hacia byte[]. Puedo crear una BitmapImage de un byte[] mediante la lectura de la matriz en un MemoryStream y el uso de BitmapImage.SetSource(). Pero me parece que no puede encontrar una manera de convertir a la inversa - de BitmapImage a byte[]. Me estoy perdiendo algo obvio aquí?

Si ayuda en absoluto, el código de conversión podría ejecutar en el servidor, es decir, que no necesita ser Silverlight de seguridad.

¿Fue útil?

Solución

Utilice esta:

public byte[] GetBytes(BitmapImage bi)
{
    WriteableBitmap wbm = new WriteableBitmap(bi);
    return wbm.ToByteArray();
}

Donde

public static byte[] ToByteArray(this WriteableBitmap bmp)
{
    // Init buffer
    int w = bmp.PixelWidth;
    int h = bmp.PixelHeight;
    int[] p = bmp.Pixels;
    int len = p.Length;
    byte[] result = new byte[4 * w * h];

    // Copy pixels to buffer
    for (int i = 0, j = 0; i < len; i++, j += 4)
    {
        int color = p[i];
        result[j + 0] = (byte)(color >> 24); // A
        result[j + 1] = (byte)(color >> 16); // R
        result[j + 2] = (byte)(color >> 8);  // G
        result[j + 3] = (byte)(color);       // B
    }

    return result;
}

Otros consejos

Yo tenía el mismo problema. He encontrado el biblioteca que hace thte trabajo de manera más fácil.

Obtener la biblioteca y hacer referencia a ella y después

                        using (var writingStream = new MemoryStream())
                        {
                            var encoder = new PngEncoder
                            {
                                IsWritingUncompressed = false
                            };
                            encoder.Encode(bitmapImageInstance, writingStream);
                            // do something with the array
                        }

Trate de usar copyPixels . Puede copiar los datos de mapa de bits a una matriz de bytes. Sin embargo, no estoy seguro de lo que honestamente el formato de los píxeles sería ... su probablemente depende del tipo de imagen que se cargó originalmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top