如何将SQLServerBLOB字符串转换为System.Drawing.Image?如何将表示为字符串的BLOB转换为类型System.Drawing.Image?背景我将使用c#从csv文件导入有关用户及其照片的信息。我使用的专有SDK要求照片是System.Drawing.Image下面是一个csv文件的示例。surnamefirstnamephotoBlogsJoe0xFFD8FFE000104A46494600010101005F005F0000FFDB0043000D090Aphoto字段其实是5k字符长,blob字段值直接在sqlserverdb中导出。我们只是从数据库字段中获取原始值并将其导出到csv文件。下面的代码演示了我已经走了多远。cvsuser变量表示csv文件的一行。//我们需要将照片从字符串转换为字节数组stringstrPhoto=null;strPhoto=csvuser.photo;//表示BLOB的字符串byte[]bytes=newbyte[strPhoto.Length*sizeof(char)];System.Buffer.BlockCopy(strPhoto.ToCharArray(),0,bytes,0,bytes.Length);//然后我们创建一个存储图像的内存流MemoryStreamphotostream=newMemoryStream(bytes);//然后我们可以使用内存流创建一个System.Drawing.Imagevarphoto=Image.FromStream(photostream);但是,Image.FromStream()行会抛出System.ArgumentException并显示消息“Invalidargument”。问题如何将表示为字符串的BLOB转换为类型System.Drawing.Image?我以前见过的例子有,例如,直接从数据库中获取blob或从文件中读取图像。问题是十六进制编码字符串到字节数组之间的转换不是一个属性。您列出的代码会将blob中的每个字符视为一个字节,因此“F”将被视为0x46(大写F的ascii代码)。你想要做的是将每2个字符解码为一个字节-即F0=240等。它假定字符串是偶数个字符。您还需要删除“0x”前缀,因为这只是一个指示符,表明后面是数据的十六进制表示形式。所以不是这个:strPhoto=csvuser.photo;//表示BLOB的字符串byte[]bytes=newbyte[strPhoto.Length*sizeof(char)];System.Buffer.BlockCopy(strPhoto.ToCharArray(),0,bytes,0,bytes.Length);做这样的事情(改编自这里给出的答案):strPhoto=csvuser.photo;//表示BLOB的字符串//删除前2个字符('0x')strPhoto=strPhoto.Remove(0,2);//将十六进制字符串转换为字节:intNumberChars=strPhoto.Length/2;byte[]bytes=newbyte[NumberChars];using(StringReadersr=newStringReader(strPhoto)){for(inti=0;iThisistoconvertyourstringtobyte[]:以上就是C#学习教程的全部内容:HowtoconvertSQLServerBLOBstringtoSystem.Drawing.Image?,如果对你有用,需要了解更多C#学习教程,希望大家多多关注---System.Text.ASCIIEncodingencoding=newSystem.Text.ASCIIEncoding();Byte[]bytes=encoding.GetBytes(strPhoto);本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如有转载,请注明出处:
