Silverlight: изображение в байтах [] - PullRequest
6 голосов
/ 24 декабря 2009

Я могу преобразовать байт [] в изображение:

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;

Но я не могу преобразовать изображение обратно в байт []! Я нашел в Интернете решение, которое работает для 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);

Библиотека Silverlight настолько мала, что у класса BitmapImage нет свойства с именем Format!

Есть у кого-нибудь идея, которая решает мою проблему.

Я долго искал в интернете, чтобы найти решение, но нет решения, которое работает в silverlight!

Спасибо!

Ответы [ 3 ]

7 голосов
/ 27 декабря 2009

(метод битов на пиксель, который вам не хватает, просто подробно описывает, как информация о цвете сохраняется на пиксель)

Как предположил Энтони, WriteableBitmap будет самым простым способом - проверьте http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html для метода, чтобы получить массив байтов argb:

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 голосов
/ 24 декабря 2009

Не существует решения, которое работает в Silverlight по дизайну. Изображения могут быть получены без необходимости соответствовать какой-либо политике междоменного доступа, как это требуется другим HTTP-запросам. Основой этого ослабления междоменных правил является то, что данные, составляющие изображение, не могут быть получены в сыром виде. Может использоваться только как изображение.

Если вы хотите просто писать и читать из растрового изображения, используйте класс WriteableBitmap вместо BitmapImage. WriteableBitmap предоставляет свойство Pixels, недоступное для BitmapImage.

2 голосов
/ 29 августа 2011
    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...