如何将 VarBinary 值转换为图像?

How do I convert a VarBinary Value to an image?

我的数据库中有一个 Table,如下所示:

Id  |  Description  | Icon

其中 Icon 列的类型为 varbinary(max)

我在这个 table 中有一行,其中 Icon 列中的值显示在 pastebin link 中(因为它是一个长值):

http://pastebin.com/LbVAf20A

我正在尝试使用下面提到的代码 here:

在我的程序中将此 varbinary 值转换为图像
var binary = new System.Data.Linq.Binary(GetBytes(StreamText)).ToArray();
using (MemoryStream stream = new MemoryStream(binary))
{
    var image = new System.Drawing.Bitmap(stream);
    image.Save(DownloadPath, ImageFormat.Png);
}

private byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
}

其中 StreamText 是 pastebin 中的字符串 link

但是在第 var image... 行我一直收到异常。

Parameter is not valid

我做错了什么?

问题是您的字符串是十六进制字符串,您试图将其转换为字节数组,就好像它是 ascii 字符串一样。您可以使用在互联网上可以找到的任何方法将十六进制字符串转换为字节数组,如下所示:

    static void Main(string[] args)
    {
        var s = "your long hex string";
        if (s.StartsWith("0x"))
            s = s.Remove(0, 2);
        using (var stream = new MemoryStream(ConvertHexStringToByteArray(s)))
        {
            var image = new Bitmap(stream);
            image.Save(DownloadPath, ImageFormat.Png);
        }            
    }

    public static byte[] ConvertHexStringToByteArray(string hexString) {
        if (hexString.Length%2 != 0) {
            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
        }

        byte[] HexAsBytes = new byte[hexString.Length/2];
        for (int index = 0; index < HexAsBytes.Length; index++) {
            string byteValue = hexString.Substring(index*2, 2);
            HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
        }

        return HexAsBytes;
    }