2009-12-24 21 views
6

sono in grado di convertire un byte [] per un'immagine:Silverlight: immagine di 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; 

Ma io non sono in grado di convertire l'immagine di nuovo ad un byte []! Ho trovato in Internet una soluzione, che funziona per 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); 

Il libary Silverlight è così piccola che la BitmapImage classe non ha formato proprietà chiamata!

Qualcuno ha un'idea che risolve il mio problema.

Ho cercato su Internet per molto tempo per trovare una soluzione, ma non c'è alcuna soluzione, che funziona in silverlight!

Grazie!

risposta

7

(i bit per il metodo pixel ti manca solo dettagli come le informazioni sul colore vengono memorizzate per pixel)

Come suggerito anthony, un WriteableBitmap sarebbe il modo più semplice - Vai http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html per un metodo per ottenere un ARGB array di byte out:

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

Non esiste alcuna soluzione che funzioni in Silverlight. Le immagini possono essere recuperate senza la necessità di conformarsi a qualsiasi criterio di accesso interdominio come richiesto da altre richieste HTTP. La base di questo rilassamento delle regole del dominio incrociato è che i dati che compongono l'immagine non possono essere recuperati nel raw. Può essere usato solo come immagine.

Se si desidera semplicemente scrivere e leggere da un'immagine bitmap, utilizzare la classe WriteableBitmap anziché BitmapImage. Il WriteableBitmap espone una proprietà Pixels non disponibile su 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

avete questo lavoro? Soprattutto bitmapSource.SetSource (stream); parte? Getta un'eccezione per me – jayarjo

Problemi correlati