在将内存流转换为图像时出现问题
本文关键字:问题 图像 内存 转换 | 更新日期: 2023-09-27 18:11:40
我发现了一些代码将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();
}
}
这个问题可以有几种解决方案。一种选择是使用PhantomJs加载HTML(从URL)并截取屏幕截图并将其保存为jpg图像。在这里查看PhantomJS的屏幕捕获功能。PhantomJs是一个运行在服务器端的无头javascript库。在单击按钮或其他事件时,您可以在服务器端使用c#执行phantomjs注释。
一般来说…
首先是Base64
字符串,然后是.NET Image
字符串,必须满足某些条件才能被认为是有效的。
For Base64
:
- 从0开始按升序排列的64位数字为大写字母"A"到"Z",小写字母"A"到"Z",数字"0"到"9",以及符号"+"answers"/"。
- 空白字符及其Unicode名称和十六进制码点是制表符(CHARACTER TABULATION, U+0009)、换行符(LINE FEED, U+000A)、回车符(carriage return, U+000D)和空白符(SPACE, U+0020)。
- s中可以出现任意数量的空白字符,因为所有空白字符都会被忽略。
- 无值字符"="用于尾部填充。s的结尾可以由0、1或2个填充字符组成。
对于.NET Image
,我们从MSDN文档中得到的所有信息是,如果
FromStream()
构造函数中抛出ArgumentException
。流没有有效的图像格式
至少我可以说,对于你的第一个错误,如果你的字符串不适合端到端,如果没有填充,代码将抛出。
如果写得正确,我确信GetBytes(string s)
是,它将在尝试转换之前执行null和长度检查。流可能不是空的,但是流的长度很可能是一个问题。
- s的长度不为0或4的倍数,忽略空白字符。
- s的格式无效。 s包含一个非base-64字符,两个以上的填充字符,或者在填充字符之间包含一个非空白字符。
你是否确保你正在读取的流的长度(不包括空格)等于4的倍数,如果流的长度确实是4的倍数,那么填充是否正确?读取流并传递它进行转换的方式,不能确保提供的是一个有效的字符串。
就像上面解释的字符串问题一样,有一种特定的方法来定义有效的图像。我没有足够的信息来详细说明有效的Image
。目前我所知道的是无效的图像无法解析。
因此,您必须尝试只传递有效的图像。上面的代码是用于读取web响应的代码,不一定是有效的图像。这就是为什么在某些情况下,当你能够在第一个"错误点"完成字符串转换时,当你试图初始化一个无效的图像时,你仍然会在下一个转换中失败。
从另一个角度看…
在第一层,您的信念,即web响应将为您提供一个有效的Base64
字符串,是naïve。作为优秀编程的最基本的一课,验证来自外部源的输入。
在下一个层次上,你的信念,从一个网络响应产生的字节将转换成一个有效的图像,无论多么随机,也是错位的。
顺便说一下,请阅读软件工程宝石,Steve McConnell的代码完整2。