我有一个web api服务,它接受一个图像(byte [])作为post / create方法的数据的一部分。我将图像数据保存在sql server blob列中。当我使用相应的get方法时,我将数据视为
“ffd8ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e ...”(已缩短)
当我查看原始图像的字节时,它们看起来就像那样(从我的二进制编辑器中剪切):
![手动方法[(http://sdrv.ms/1bjgsnX)
我需要一种方法将数据转换为正确的jpg文件。我尝试了几件事,但最后不得不手动完成。我没有在这里包括我使用Image的尝试,但它们也很多并且不成功。必须有一种更标准的方式来做我需要做的事情。对于所有这些方法,我使用相同的文件编写代码:
string base64String = Convert.ToBase64String(photoFromDB, Base64FormattingOptions.None);
//various methods to convert that to a byte[] tempBytes
string DestFilePath = "testManual.jpg";
System.IO.FileStream fs = new System.IO.FileStream(DestFilePath,
System.IO.FileMode.Create, System.IO.FileAccess.Write);
fs.Write(tempBytes, 0, tempBytes.Length);
fs.Close();
以下是我的尝试和结果:
![所有方法[(http://sdrv.ms/1bjgegH)
//Manual method that works but I don’t like.
byte[] tempBytes = new byte[base64String.Length/2];
string tempString;
byte tempByte;
int count = 0;
for (int i = 0; i < base64String.Length; i = i+2)
{
tempString = base64String.Substring(i, 2);
tempByte = Convert.ToByte(tempString, 16);
tempBytes[count++] = tempByte;
}
//Unicode convert
//I can see my data here but it has extra nulls included.
tempBytes = System.Text.Encoding.Unicode.GetBytes(base64String);
//UTF32 convert
//again can see my data but even more nulls included
tempBytes = System.Text.Encoding.UTF32.GetBytes(base64String);
//UTF7, UTF8, and Default, ASCII, BigEndianUnicodegive me the same output
//I can see my data but it isn’t correct yet
tempBytes = System.Text.Encoding.UTF7.GetBytes(base64String);
tempBytes = System.Text.Encoding.UTF8.GetBytes(base64String);
tempBytes = System.Text.Encoding.Default.GetBytes(base64String);
tempBytes = System.Text.Encoding.ASCII.GetBytes(base64String);
tempBytes = System.Text.Encoding.BigEndianUnicodegive.GetBytes(base64String);
我错过了什么秘诀?
答案 0 :(得分:3)
我不太确定你为什么要在这里尝试base64编码/解码...如果你已经有一个字节数组,为什么不用File.WriteAllBytes(...);
将它们放到JPEG文件中呢? / p>
答案 1 :(得分:1)
对于我的使用,我写了两个小函数来实现这个转换
#region public byte[] BitmapToBytes(Image bmp, ImageFormat p_Format)
public byte[] BitmapToBytes(Image bmp, ImageFormat p_Format)
{
MemoryStream stream = new MemoryStream();
try
{
bmp.Save(stream, p_Format);
}
catch (Exception ex)
{
}
return stream.ToArray();
}
#endregion
#region public Image BytesToBitmap(byte[] bytes)
public Image BytesToBitmap(byte[] bytes)
{
MemoryStream stream = null;
try
{
stream = new MemoryStream(bytes);
}
catch (Exception ex)
{
}
return new Bitmap(stream);
}
#endregion
答案 2 :(得分:0)
Thorsten Dittmar是对的。
然后您转换为Base64字符串
string base64String = Convert.ToBase64String(photoFromDB,Base64FormattingOptions.None); //将其转换为byte [] tempBytes ....
然后你从字符串(Base64String)转换回数组[]!
... tempByte = Convert.ToByte(tempString,16); ...
<强>为什么呢?试试Thorsten Dittmar建议的File.WriteAllBytes(...)。