Silverlight:图像到字节[]

时间:2009-12-24 14:14:11

标签: silverlight

我可以将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;

但是我无法将Image转换回byte []! 我在互联网上找到了一个适用于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 个答案:

答案 0 :(得分:7)

(您缺少的每像素位方法只详细说明了每个像素的颜色信息存储方式)

正如anthony建议的那样,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;
}

答案 1 :(得分:3)

没有解决方案可以通过设计在Silverlight中运行。可以检索图像,而无需像其他http请求那样符合任何跨域访问策略。放宽跨域规则的基础是不能在原始数据中检索构成图像的数据。它只能用作图像。

如果您只想简单地写入和读取位图图像,请使用WriteableBitmap类而不是BitmapImageWriteableBitmap公开了Pixels上没有的BitmapImage属性。

答案 2 :(得分: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);
    }