在将内存流转换为图像时出现问题

本文关键字:问题 图像 内存 转换 | 更新日期: 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和长度检查。流可能不是空的,但是流的长度很可能是一个问题

  1. s的长度不为0或4的倍数,忽略空白字符。
  2. s的格式无效。 s包含一个非base-64字符,两个以上的填充字符,或者在填充字符之间包含一个非空白字符。

你是否确保你正在读取的流的长度(不包括空格)等于4的倍数,如果流的长度确实是4的倍数,那么填充是否正确?读取流并传递它进行转换的方式,不能确保提供的是一个有效的字符串。

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

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


从另一个角度看…

在第一层,您的信念,即web响应将为您提供一个有效的Base64字符串,是naïve。作为优秀编程的最基本的一课,验证来自外部源的输入。

在下一个层次上,你的信念,从一个网络响应产生的字节将转换成一个有效的图像,无论多么随机,也是错位的。


顺便说一下,请阅读软件工程宝石,Steve McConnell的代码完整2。