Domanda

Sto cercando di passare un po 'la rappresentazione di un'immagine avanti e indietro tra Silverlight e un servizio WCF. Se possibile mi piacerebbe passare un System.Windows.Media.Imaging.BitmapImage, in quanto ciò significherebbe il cliente non deve fare alcuna conversione.

Tuttavia, ad un certo punto ho bisogno di memorizzare l'immagine in un database, il che significa la rappresentazione dell'immagine deve essere in grado di convertire da e verso byte[]. Posso creare un BitmapImage da un byte[] leggendo la matrice in un MemoryStream e utilizzando BitmapImage.SetSource(). Ma io non riesco a trovare un modo per convertire l'altro modo - da BitmapImage a byte[]. Mi sto perdendo qualcosa di ovvio qui?

Se aiuta a tutti, il codice di conversione potrebbe eseguire sul server, vale a dire che non ha bisogno di essere Silverlight-safe.

È stato utile?

Soluzione

Utilizzare questa:

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

Dove

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

Altri suggerimenti

Ho avuto lo stesso problema. Ho trovato il ImageTools libreria che rende thte lavoro modo più semplice.

Ottenere la libreria e fare riferimento a esso e quindi

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

Prova a usare copyPixels . È possibile copiare i dati bitmap a un array di byte. Tuttavia, io non sono sicuro di quello che onestamente il formato dei pixel sarebbe ... la sua, probabilmente dipende dal tipo di immagine che è stato originariamente caricato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top