如何获取 C# WebBrowser 控件来显示 jpeg 文件(原始)?
-
08-07-2019 - |
题
有谁知道在 .Net 2.0 - .Net 3.5 中如何将 jpeg 作为字节数组加载到 System.Windows.Forms.WebControl 中并设置正确的 mimetypes 以使其显示?
就像是:
webBrowser1.DocumentStream = new MemoryStream(File.ReadAllBytes("mypic.jpg"));
webBrowser1.DocumentType = "application/jpeg";
webBrowser1.DocumentType 似乎是只读的,所以我不知道该怎么做。一般来说,我希望能够加载任何类型的文件源,并在浏览器中定义定义的 mimetype 来显示它。
写入临时文件的解决方案并不是很好的解决方案。目前,我已经通过一个小的本地网络服务器套接字侦听器解决了这个问题,该侦听器可以提供我要求的具有正确 mimetype 的 jpeg。
更新:由于有人删除了一个回答我自己的问题,其中我有其他人可以使用的信息,因此我将其添加为更新。(对于那些以这种方式删除的人,请用重要信息更新问题)。
这里的 C# 示例解决方案完美运行: http://www.codeproject.com/KB/aspnet/AspxProtocol.aspx
解决方案
您必须实现异步可插拔协议,例如IClassFactory,IInternetProtocol ...然后使用CoInternetGetSession注册您的协议。当IE调用您的实现时,您可以从内存/提供mime类型提供图像数据。
这有点乏味,但可行。请参阅 MSDN 上的IInternetProtocol和可插入协议文档。
其他提示
你不能这样做。您无法将图像填充到Microsoft的Web浏览器控件中。
限制来自IWebBrowser控件本身,.NET包装。
如果您想要彻底破解,请尝试将您的信息流设为仅显示您的图片的HTML文件。丢失了图像字节流,必须将图像写入磁盘。
我不知道是否 WebBrowser
.NET 控件支持这一点,但是 RFC2397 定义如何使用内联图像。使用它和动态创建的 XHTML 片段,您可以分配图像,而无需将其写入文件。
Image someImage = Image.FromFile("mypic.jpg");
// Firstly, get the image as a base64 encoded string
ImageConverter imageConverter = new ImageConverter();
byte[] buffer = (byte[])imageConverter.ConvertTo(someImage, typeof(byte[]));
string base64 = Convert.ToBase64String(buffer, Base64FormattingOptions.InsertLineBreaks);
// Then, dynamically create some XHTML for this (as this is just a sample, minimalistic XHTML :D)
string html = "<img src=\"data:image/" . someImage.RawFormat.ToString() . ";base64, " . $base64 . "\">";
// And put it into some stream
using (StreamWriter streamWriter = new StreamWriter(new MemoryStream()))
{
streamWriter.Write(html);
streamWriter.Flush();
webBrowser.DocumentStream = streamWriter.BaseStream;
webBrowser.DocumentType = "text/html";
}
不知道这个解决方案是否优雅,但我想它不是。我不确定的借口是现在已经是深夜了。:)
参考:
IE仅支持32KB用于base64编码的内嵌图像,因此不是一个好的解决方案。