2009-12-05 19 views
6

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 un System.Windows.Media.Imaging.BitmapImage, ya que eso significaría que el cliente no tiene que hacer ninguna conversión.¿Puedo obtener un byte [] de una BitmapImage en Silverlight?

Sin embargo, en algún momento necesito almacenar esta imagen en una base de datos, lo que significa que la representación de la imagen debe poder convertir ay desde byte[]. Puedo crear un BitmapImage desde un byte[] leyendo la matriz en un MemoryStream y utilizando BitmapImage.SetSource(). Pero parece que no puedo encontrar la manera de convertir a la inversa, desde BitmapImage hasta byte[]. ¿Me estoy perdiendo algo obvio aquí?

Si sirve de algo, el código de conversión podría ejecutarse en el servidor, es decir, no necesita ser seguro de Silverlight.

+0

¿Alguna vez una solución para esto? –

+0

No. La imagen se estaba cargando inicialmente a través del usuario seleccionándola en un cuadro de diálogo Abrir. La solución alternativa era acceder a openDialog.File.OpenRead, crear un BinaryReader a partir de esa transmisión y luego llamar a ReadBytes() en el lector para obtener un byte []. No he estado al día con Silverlight 4, puede haber una solución disponible ahora. – goric

Respuesta

6

Utilice esta:

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

Dónde

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; 
} 
0

Intente utilizar CopyPixels. Puede copiar los datos del mapa de bits en una matriz de bytes. Sin embargo, sinceramente, no estoy seguro de cuál sería el formato de los píxeles ... es probable que dependa del tipo de imagen que se cargó originalmente.

+0

La página a la que se ha vinculado es para .NET en general, la versión Silverlight de BitmapSource (en System.Windows.dll) no es compatible con este método: http://msdn.microsoft.com/en-us/library/system .windows.media.imaging.bitmapsource% 28VS.95% 29.aspx – goric

+0

Oh, disculpas. Olvidé que Silverlight y WPF aún no son del todo iguales. – jrista

1

que tenían el mismo problema. Encontré el ImageTools library que hace el trabajo mucho más fácil.

Consigue la biblioteca y hacer referencia a ella y luego

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