我发现了一些将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();
}
}
答案 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)
是,它会在尝试转换之前执行空值和长度检查。 您的信息流可能不为空,但您的信息流长度很可能是一个问题。 有两种方法可以犯错:
您是否确保您正在阅读的流的长度(不包括空格)等于4的倍数AND,如果确实流长度是4的倍数,那么填充是否合适?您正在阅读流并将其传递以进行转换的方式,您无法确定是否提供了有效的字符串。
就像上面解释的字符串问题一样,有一种特定的方法来定义有效的图像。我没有足够的信息来详细说明有效的Image
。目前我所知道的是无效图像无法解析。
因此,您必须尝试仅传递有效图像。您上面的代码是用于阅读Web响应的代码,而不一定是有效的图像。这就是为什么在某些情况下,当你能够在第一个“错误点”完成字符串转换时,在尝试初始化无效图像时,你仍然会在下一个失败时失败。
在第一级,您的信念,即网络响应将为您提供有效的Base64
字符串,是天真的。作为良好编程的最基本教训,验证来自外部资源的输入。
在下一个层面上,您的信念是,从网络响应创建的字节将转换为有效图像,无论多么随机,也是错位的。
在旁注中,请阅读软件工程宝石Steve McConnell的Code Complete 2。