2013-07-26 70 views
13

我有下面的代码图像转换为Base64:转换图像为base64

private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
     StreamResourceInfo sri = null; 
     Uri uri = new Uri("Checked.png", UriKind.Relative); 
     sri = Application.GetResourceStream(uri); 

     BitmapImage bitmap = new BitmapImage(); 
     bitmap.SetSource(sri.Stream); 
     WriteableBitmap wb = new WriteableBitmap(bitmap); 

     MemoryStream ms = new MemoryStream(); 
     wb.SaveJpeg(ms, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100); 
     byte[] imageBytes = ms.ToArray(); 

     base64 = System.Convert.ToBase64String(imageBytes); 

    } 

而下面的代码获取位图图像的形式基地64:当我转换

public static BitmapImage base64image(string base64string) 
    { 
     byte[] fileBytes = Convert.FromBase64String(base64string); 

     using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length)) 
     { 
      ms.Write(fileBytes, 0, fileBytes.Length); 
      BitmapImage bitmapImage = new BitmapImage(); 
      bitmapImage.SetSource(ms); 
      return bitmapImage; 
     } 
    } 

所以和deconvert它是空白的。

我知道逆转换的作品,因为,当我给他精确的字符串:

string base64="iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAACH0lEQVR42q3WoZKrMBQGYGRkIpHEoY9DMrh1nUGtzxPcGV7gCsTaK3iBCqa2ipmrVqLrWrmytjL3nBwoEGD30ja/6JaSj/wp3SEIXjpUoB+Oeg0zpoR+NsyoDVOgi39cbYHAy4MQTc0wOYZepxRBUkn9UxxEiNnXxyYwd6w/438hSddHJilv1tqv664Shle1DeJaJihPV9uNQ+NWBRK2QVSr+GjtaFzOIpdjKFShnoY+Gv0N0u0OVLexY48NQ+68JchdpQu/o1piVMu6faJdwjNWIAYyl55bqGUtbndO53TzCIpUpCkdlEm+V3J3Ir8r3uops2+FkTmvx832IGJwN97xS/5Ti0LQ/WLwtbxMal2ueAwvc2c8CAgSJip5U4+tKHECMlUzq2UcA9EyROuJi6/71dtzWAfVcq0Jw1CsYh13kDDteVoirE+zWtLVinQ8ZAS5YlVlvRHWfi3pakUQL0OOwmp/W/vN6Gt5zBIkzEezxnCtMJsxDIECTYmhp3bej4HHzaalNMyAnzE0UBKp6Z1Do2pwd3JkAH6CxlTs/bZOZ661yMwhohDLQqREMWz8UAvWoUQleggehG5dSPUbv28GJlnKHGJsqPi7vuG/MGTyCGslOtkCOayrGOa/indajdudb6FUpXoepgiLHIIMriddyzrkMBhGAqlOH4U2hKCT2j0NdU8jFbzpZ3LQlh9srPqEQ1Y9lEP2CVa99KHvH8mnrGGdl9V9AAAAAElFTkSuQmCC"; 

这是我的Checked.png转换在线转换器。它完美分解。

,这是我的base64,这是我得到的转换:

"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" 

我的问题是字符串,我得到为base64从我的代码 - 是不正确 * 我做错了什么? *

+0

请将问题添加到您的陈述中。到目前为止,样本中没有明显的差异,也没有关于什么不起作用的信息/你得到了什么错误。 –

+0

你在哪里得到问题或什么不工作? –

+0

你是什么意思“不正确”?您的字节序列代表完全有效的** jpg **复选标记的图像... –

回答

20

关于尝试什么:

public static BitmapImage base64image(string base64string) 
{ 
    byte[] fileBytes = Convert.FromBase64String(base64string); 

    using (MemoryStream ms = new MemoryStream(fileBytes)) 
    { 
     Image streamImage = Image.FromStream(ms); 
     context.Response.ContentType = "image/jpeg"; 
     streamImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     return streamImage; 
    } 
} 

我同意阿列克谢您在读取图像的代码看起来确实有点怪。我最近为一个类似的任务编写了一些代码,这可能会指引您朝着正确的方向发展:

 string fileContent = null; 
     /* Check the file actually has some content to display to the user */ 
     if (uploadFile != null && uploadFile.ContentLength > 0) 
     { 
      byte[] fileBytes = new byte[uploadFile.ContentLength]; 
      int byteCount = uploadFile.InputStream.Read(fileBytes, 0, (int)uploadFile.ContentLength); 
      if (byteCount > 0) 
      { 
       fileContent = CreateBase64Image(fileBytes); 
      } 
     } 

    private string CreateBase64Image(byte[] fileBytes) 
    { 
     Image streamImage; 
     /* Ensure we've streamed the document out correctly before we commit to the conversion */ 
     using (MemoryStream ms = new MemoryStream(fileBytes)) 
     { 
      /* Create a new image, saved as a scaled version of the original */ 
      streamImage = ScaleImage(Image.FromStream(ms)); 
     } 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      /* Convert this image back to a base64 string */ 
      streamImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
    } 
2

不是一个答案:更多的是长时间的评论...... OP指出解码代码工作得很好,也看起来很可疑。另外代码假设进行验证,以对PNG图像的工作,但可以节省代码明确产生有效的JPG与SaveJpeg电话...


你的代码读取创建流看起来很奇怪 - 你创造超过现有的字节数组流,比写入相同的字节流,并通过该流而不回0到某种方法。

可能的解决方法(假设BitampImage,接受JPG流):

  • 不叫Write在所有的流已经有你想要的
  • 设置ms.Position = 0写入流后的字节数。

注:我不知道,如果它是确定处置流是为BitmapImage源,您可能需要删除using了。