将MemoryStream转换为Image时出现问题

时间:2015-09-06 23:31:08

标签: c# .net

我发现了一些将HTML转换为JPG文件的代码,但是使用详细的HTML我得到了无效的Base64错误,而如果我传递了一个非常基本的HTML行,我会收到一个奇怪的错误"无效参数"在创建图像FromStream时。这是我找到的代码:

public static void saveURLToImage(string url, string file_name)
{
    if (!string.IsNullOrEmpty(url))
    {
        string content = "";

        System.Net.WebRequest webRequest = WebRequest.Create(url);
        System.Net.WebResponse webResponse = webRequest.GetResponse();
        System.IO.StreamReader sr = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8"));
        content = sr.ReadToEnd();
        //following line will trigger "invalid Base64" error
        byte[] b = Encoding.Unicode.GetBytes(content);// Convert.FromBase64String(content);
        System.IO.MemoryStream ms = new System.IO.MemoryStream(b);
        //following line will trigger "invalid parameter" error
        System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
        img.Save(file_name, System.Drawing.Imaging.ImageFormat.Jpeg);

        img.Dispose();
        ms.Close();
    }
}

2 个答案:

答案 0 :(得分:1)

这个问题可以有几种解决方案。一种选择是使用PhantomJs加载HTML(来自URL)并截取屏幕截图并将其保存为jpg图像。检查screen capture feature of PhantomJS here。 PhantomJs是一个在服务器端运行的无头javascript库。在按钮单击或其他事件上,您可以在服务器端使用C#执行phantomjs表彰。

答案 1 :(得分:0)

一般......

首先是Base64字符串,然后是.NET Image 符合某些条件才能被视为有效。

Base64

  
      
  • 从零开始按升序排列的base-64数字是大写字母“A”到“Z”,小写字母“a”到“z”,数字“0”到“9”,符号“+”和“/".
  •   
  • 空白字符及其Unicode名称和十六进制代码点是制表符(CHARACTER TABULATION,U + 0009),换行符(LINE FEED,U + 000A),回车符(CARRIAGE RETURN,U + 000D),和空白(空格,U + 0020)。
  •   
  • 可以在s中显示任意数量的空白字符,因为忽略了所有空白字符。
  •   
  • 无值字符“=”用于尾随填充。 s的结尾可以包含零个,一个或两个填充字符。
  •   

对于.NET Image,我们从MSDN文档中获得的是ArgumentException构造函数中的FromStream()如果

  

流没有有效的图片格式

在你的情况下......

至少我可以说,对于你的第一个错误,如果你的字符串不适合端到端,如果没有填充,代码就会抛出。

如果写得正确,我确信GetBytes(string s)是,它会在尝试转换之前执行空值和长度检查。 您的信息流可能不为空,但您的信息流长度很可能是一个问题有两种方法可以犯错:

  1. s 的长度,忽略空格字符,不为零或为4的倍数。
  2. s的格式无效。 s包含非base-64字符,两个以上的填充字符或填充字符中的非空白字符。
  3. 您是否确保您正在阅读的流的长度(不包括空格)等于4的倍数AND,如果确实流长度是4的倍数,那么填充是否合适?您正在阅读流并将其传递以进行转换的方式,您无法确定是否提供了有效的字符串。

    就像上面解释的字符串问题一样,有一种特定的方法来定义有效的图像。我没有足够的信息来详细说明有效的Image。目前我所知道的是无效图像无法解析。

    因此,您必须尝试仅传递有效图像。您上面的代码是用于阅读Web响应的代码,而不一定是有效的图像。这就是为什么在某些情况下,当你能够在第一个“错误点”完成字符串转换时,在尝试初始化无效图像时,你仍然会在下一个失败时失败。

    从另一个角度看......

    在第一级,您的信念,即网络响应将为您提供有效的Base64字符串,是天真的。作为良好编程的最基本教训,验证来自外部资源的输入。

    在下一个层面上,您的信念是,从网络响应创建的字节将转换为有效图像,无论多么随机,也是错位的。

    在旁注中,请阅读软件工程宝石Steve McConnell的Code Complete 2