Могу ли я получить байт [] из BitmapImage в Silverlight? - PullRequest
6 голосов
/ 05 декабря 2009

Я пытаюсь передать некоторое представление изображения назад и вперед между Silverlight и службой WCF. Если возможно, я бы хотел передать System.Windows.Media.Imaging.BitmapImage, так как это означало бы, что клиент не должен делать никаких преобразований.

Однако в какой-то момент мне нужно сохранить это изображение в базе данных, а это означает, что представление изображения должно быть в состоянии преобразовать в byte[]. Я могу создать BitmapImage из byte[], считав массив в MemoryStream и используя BitmapImage.SetSource(). Но я не могу найти способ конвертировать другой путь - от BitmapImage до byte[]. Я что-то упускаю здесь очевидное?

Если это вообще поможет, код преобразования может выполняться на сервере, т. Е. Он не должен быть безопасным для Silverlight.

Ответы [ 3 ]

6 голосов
/ 03 декабря 2010

Используйте это:

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;
}
1 голос
/ 14 февраля 2011

У меня была такая же проблема. Я обнаружил библиотеку ImageTools , которая облегчает работу.

Получить библиотеку и сослаться на нее и затем

                        using (var writingStream = new MemoryStream())
                        {
                            var encoder = new PngEncoder
                            {
                                IsWritingUncompressed = false
                            };
                            encoder.Encode(bitmapImageInstance, writingStream);
                            // do something with the array
                        }
0 голосов
/ 05 декабря 2009

Попробуйте использовать CopyPixels . Вы можете скопировать данные растрового изображения в байтовый массив. Однако я, честно говоря, не уверен, какой будет формат пикселей ... это, вероятно, зависит от типа изображения, которое было изначально загружено.

...