试图将byte []转换为jpg文件

时间:2014-02-10 15:15:44

标签: c# image

我有一个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);

我错过了什么秘诀?

3 个答案:

答案 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是对的。

  1. 您有byte []
  2. 中的数据
  3. 然后您转换为Base64字符串

    string base64String = Convert.ToBase64String(photoFromDB,Base64FormattingOptions.None); //将其转换为byte [] tempBytes ....

  4. 的各种方法
  5. 然后你从字符串(Base64String)转换回数组[]!

    ... tempByte = Convert.ToByte(tempString,16); ...

    <强>为什么呢?试试Thorsten Dittmar建议的File.WriteAllBytes(...)。