我如何将VarBinary值转换为图像

本文关键字:转换 图像 VarBinary | 更新日期: 2023-09-27 18:07:53

我有一个表在我的数据库像这样:

Id  |  Description  | Icon

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

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

http://pastebin.com/LbVAf20A

我正在尝试使用以下代码将这个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链接中的字符串

但是在var image...行,我一直得到异常。

参数无效

我做错了什么?

我如何将VarBinary值转换为图像

问题是你的字符串是十六进制字符串,你试图将其转换为字节数组,如果它是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;
    }