简体   繁体   English

如何将SQL Server BLOB字符串转换为System.Drawing.Image?

[英]How to convert an SQL Server BLOB string to System.Drawing.Image?

How can I convert a BLOB represented as a string to a System.Drawing.Image type? 如何将表示为字符串的BLOB转换为System.Drawing.Image类型?

Background 背景

I am going to import information about users together with their photo from a csv file using c#. 我将使用c#从csv文件导入有关用户的信息及其照片。 The proprietary SDK that I use requires the photo to be a System.Drawing.Image 我使用的专有SDK要求照片是System.Drawing.Image

Below is an example of the csv file. 下面是csv文件的示例。

surname firstname   photo                       
Blogs    Joe        0xFFD8FFE000104A46494600010101005F005F0000FFDB0043000D090A

The photo field is actually 5k chars long and is a direct export of the BLOB field value in the sql server db. 照片字段实际上是5k字符长,并且是在sql server db中直接导出BLOB字段值。 We have just taken the raw value from the database field and exported it to the csv file. 我们刚从数据库字段中取出原始值并将其导出到csv文件。

Below is the code that demonstrates how far I have got. 下面的代码演示了我有多远。 The cvsuser variable represents one row of the csv file. cvsuser变量表示csv文件的一行。

// We need to convert the photo from a string to a byte array
string strPhoto = null;
strPhoto = csvuser.photo; // The string that represents the BLOB
byte[] bytes = new byte[strPhoto.Length * sizeof(char)];
System.Buffer.BlockCopy(strPhoto.ToCharArray(), 0, bytes, 0, bytes.Length);

// Then we create a memory stream that holds the image
MemoryStream photostream = new MemoryStream( bytes );

// Then we can create a System.Drawing.Image by using the Memory stream
var photo = Image.FromStream(photostream);

However, the Image.FromStream() line throws a System.ArgumentException with the message "Parameter is not valid." 但是, Image.FromStream()行抛出System.ArgumentException,并显示消息“参数无效”。

Question

How can I convert the BLOB represented as a string to a System.Drawing.Image type? 如何将表示为字符串的BLOB转换为System.Drawing.Image类型?

The examples I have seen previously would, for example, fetch the blob straight from the database or reading the image from a file. 我之前看到的例子是,例如,直接从数据库中获取blob或从文件中读取图像。

The issue is that the conversion between the hex-encoded string to byte array isn't being done property. 问题是十六进制编码的字符串到字节数组之间的转换不是属性。

The code you listed will treat each of the chars in the blob as a byte, so an 'F' will be treated as 0x46 (the ascii code for a capital F). 您列出的代码会将blob中的每个字符视为一个字节,因此“F”将被视为0x46(大写字母F的ascii代码)。 What you want to do is de-code each 2 characters as a single byte - ie F0 = 240 etc. 你想要做的是将每2个字符解码为单个字节 - 即F0 = 240等。

It assumes the string is an even number of characters. 它假定字符串是偶数个字符。 You'll also need to strip off the '0x' prefix, as that's just an indicator that what follows is a hexadecimal representation of the data. 您还需要去掉'0x'前缀,因为这只是一个指示,即后面的内容是数据的十六进制表示。

So instead of this: 所以不是这样的:

strPhoto = csvuser.photo; // The string that represents the BLOB
byte[] bytes = new byte[strPhoto.Length * sizeof(char)];
System.Buffer.BlockCopy(strPhoto.ToCharArray(), 0, bytes, 0, bytes.Length);

Do something like this (adapted from previous answer given here ): 做这样的事情(改编自此处给出的答案):

      strPhoto = csvuser.photo; // The string that represents the BLOB

      //remove first 2 chars (the '0x')
      strPhoto = strPhoto.Remove(0, 2);

      //convert hex-string to bytes:
      int NumberChars = strPhoto.Length/2;
      byte[] bytes = new byte[NumberChars];
      using (StringReader sr = new StringReader(strPhoto)){
            for (int i = 0; i < NumberChars; i++)
               bytes[i] = Convert.ToByte(new string(new char[2]{(char)sr.Read(), (char)sr.Read()}), 16);
      }

      // Then we create a memory stream that holds the image
      MemoryStream photostream = new MemoryStream( bytes );

      // Then we can create a System.Drawing.Image by using the Memory stream
      var photo = Image.FromStream(photostream);

Do this to convert your string to byte[] : 这样做是为了将您的string转换为byte[]

System.Text.ASCIIEncoding  encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(strPhoto);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM