2009-12-24 22 views
6

soy capaz de convertir un byte [] a una imagen:Silverlight: Imagen de byte []

byte[] myByteArray = ...; // ByteArray to be converted 

MemoryStream ms = new MemoryStream(my); 
BitmapImage bi = new BitmapImage(); 
bi.SetSource(ms); 

Image img = new Image(); 
img.Source = bi; 

Pero no soy capaz de convertir la imagen a un byte []! que he encontrado en Internet una solución, que trabaja para WPF:

var bmp = img.Source as BitmapImage; 
int height = bmp.PixelHeight; 
int width = bmp.PixelWidth; 
int stride = width * ((bmp.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 
bmp.CopyPixels(bits, stride, 0); 

El libary Silverlight es tan pequeña que el BitmapImage clase no tiene propiedad llamada Formato!

Alguien tiene una idea que resuelve mi problema.

He buscado en Internet durante mucho tiempo para encontrar una solución, pero no hay solución, que funciona en Silverlight!

Gracias!

Respuesta

7

(los bits por el método de píxeles que faltan solo detalles de cómo se almacena la información de color por píxel)

Como sugirió Anthony, un WriteableBitmap sería la forma más fácil - echa un vistazo a http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html de un método para obtener una ARGB matriz de bytes a cabo:

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

No hay ninguna solución que funcione en Silverlight por diseño. Las imágenes se pueden recuperar sin la necesidad de cumplir con ninguna política de acceso de dominio cruzado, ya que otras solicitudes http deben hacerlo. La base de esta relajación de las reglas de dominio cruzado es que los datos que componen la imagen no se pueden recuperar en bruto. Solo se puede usar como una imagen.

Si desea simplemente escribir y leer desde una imagen de mapa de bits utilice la clase WriteableBitmap en lugar de BitmapImage. El WriteableBitmap expone una propiedad Pixels no disponible en el BitmapImage.

2
public static void Save(this BitmapSource bitmapSource, Stream stream) 
    { 
     var writeableBitmap = new WriteableBitmap(bitmapSource); 

     for (int i = 0; i < writeableBitmap.Pixels.Length; i++) 
     { 
      int pixel = writeableBitmap.Pixels[i]; 

      byte[] bytes = BitConverter.GetBytes(pixel); 
      Array.Reverse(bytes); 

      stream.Write(bytes, 0, bytes.Length); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, byte[] bytes) 
    { 
     using (var stream = new MemoryStream(bytes)) 
     { 
      bitmapSource.SetSource(stream); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, Stream stream) 
    { 
     bitmapSource.SetSource(stream); 
    } 
+0

¿tiene este trabajo? Especialmente bitmapSource.SetSource (stream); ¿parte? Lanza una excepción para mí. – jayarjo

Cuestiones relacionadas