如何在C#中将字节数组转换为图像?

3
我有一个SQL Server数据库,其中存储了PNG图片。这些截图的值以十六进制表示(0x085A3B...)。如何从“截图”(我的自定义数据类型)转换为“Image”,或类似于“BitmapImage”的东西?
首先,我像这样获取截图:
private Screenshot LoadScreenshot()
{
    using (var context = new Context())
    {
        return context.Screenshots.FirstOrDefault();
    }
}

上述方法会返回一个类似于字节数组的东西。
byte[40864]

我无法执行以下操作,因为我遇到了异常(我不知道是哪种异常以及为什么会出现):

public BitmapImage ImageFromBuffer(Byte[] bytes)
{
    MemoryStream stream = new MemoryStream(bytes);
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.StreamSource = stream;
    image.EndInit(); //the compiler breaks here
    return image;
}

我正在使用C#和WPF

谢谢

编辑:

这是我的异常:

System.Runtime.Serialization.SafeSerializationManager 找不到适合完成此操作的成像组件

如何解决:

我需要添加这行代码:

Byte[] screenshotBytes = screenshot.Screenshot; //.Screenshot is a byte [] (I dont knwo why it didnt work before)

而@frebinfrancis的方法


2
可能是将字节数组转换为WPF中的图像的重复问题。 - dymanoid
2
我看到了他的帖子。我的问题是我得到了一个异常。 - Na Me
2
那个问题也有一个异常。 - dymanoid
2
答案对我没用。 - Na Me
1
异常是运行时错误,而不是编译时问题。你能发布一下你得到的异常详细信息吗?另外,你尝试过将该字节数组保存为带有.png扩展名的文件吗?结果是否为正确的图像? - Pieter Witvoet
显示剩余4条评论
2个回答

3

你的代码看起来很不错,没有问题。当我尝试做同样的事情时,有些图像可以正常工作,但有些则不行。经过长时间搜索,我找到了以下链接。

http://support.microsoft.com/kb/2771290

这是我的代码:

public BitmapImage ImageFromBuffer(Byte[] bytes)
        {
            if (bytes == null || bytes.Length == 0) return null;
            var image = new BitmapImage();
            using (var mem = new MemoryStream(bytes))
            {
                mem.Position = 0;
                image.BeginInit();
                image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.UriSource = null;
                image.StreamSource = mem;
                image.EndInit();
            }
            image.Freeze();
            return image;
        }

0

试试这个:

public void SaveBitmap(string fileName, int width, int height, byte[] imageData)
{
  var data = new byte[width * height * 4];

  int o = 0;

  for (var i = 0; i < width * height; i++)
  {
     var value = imageData[i];

     data[o++] = value;
     data[o++] = value;
     data[o++] = value;
     data[o++] = 0;
  }

  unsafe
  {
     fixed (byte* ptr = data)
     {
        using (Bitmap image = new Bitmap(width, height, width * 4,PixelFormat.Format32bppRgb, new IntPtr(ptr)))
        {
           image.Save(Path.ChangeExtension(fileName, ".bmp"));
        }
      }
   }
}

没有Bitmap类。 - Na Me
1
@NaMe System.Drawing.Bitmap - chouaib
还没有引用的伙伴(我是否缺少一个程序集?) - Na Me
2
在谷歌上搜索完整的类型名称通常会出现一个MSDN页面,记录了该类型的详细信息,包括它所在的程序集:https://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap(v=vs.110).aspx - Pieter Witvoet
@NaMe,你还没有弄清楚Bitmap的问题吗? - chouaib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接