Question

Je suis en train de passer une représentation d'une image et-vient entre Silverlight et un service de WCF. Si possible, je voudrais passer un System.Windows.Media.Imaging.BitmapImage, car cela signifierait que le client n'a pas à faire une conversion.

Cependant, à un moment donné, je dois stocker cette image dans une base de données, ce qui signifie la représentation de l'image doit être en mesure de convertir et de byte[]. Je peux créer un BitmapImage d'un byte[] en lisant le tableau dans un MemoryStream et en utilisant BitmapImage.SetSource(). Mais je ne peux pas sembler trouver un moyen de convertir l'autre sens - de BitmapImage à byte[]. Est-ce que je manque quelque chose évidente ici?

Si elle aide à tous, le code de conversion pourrait fonctionner sur le serveur, à savoir qu'il n'a pas besoin d'être Silverlight de sécurité.

Était-ce utile?

La solution

Utilisez ceci:

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

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

Autres conseils

J'ai eu le même problème. J'ai trouvé la bibliothèque qui fait thte tâche beaucoup plus facile.

Obtenir la bibliothèque et la référence, puis

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

Essayez d'utiliser CopyPixels . Vous pouvez copier les données bitmap à un tableau d'octets. Cependant, je suis franchement pas sûr de ce que le format des pixels serait ... sa dépend probablement du type d'image qui a été à l'origine chargée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top