如何获取C#WebBrowser控件来显示jpeg文件(原始)?

时间:2008-11-14 13:13:23

标签: c# .net webbrowser-control

有没有人知道.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来显示它。

编写临时文件的解决方案并不好。目前我已经通过一个小的本地webserver套接字监听器解决了这个问题,该监听器使用正确的mimetype提供了我要求的jpeg。

更新:由于有人删除了我自己的答案问题,其中我有其他人可以使用的信息,我会将其添加为更新。 (对于那些删除该方式的人,请使用重要信息更新问题)。

C#中的示例解决方案完美无缺:http://www.codeproject.com/KB/aspnet/AspxProtocol.aspx

6 个答案:

答案 0 :(得分:5)

您必须实现异步可插拔协议,例如IClassFactory,IInternetProtocol ...然后使用CoInternetGetSession注册您的协议。当IE调用您的实现时,您可以从内存提供图像数据/提供mime类型。

这有点乏味,但可行。查看MSDN上的IInternetProtocol和可插拔协议文档。

答案 1 :(得分:0)

你不能这样做。您无法将图像填充到Microsoft的Web浏览器控件中。

限制来自IWebBrowser控件本身,.NET包装。

答案 2 :(得分:0)

如果您想要彻底破解,请尝试将您的信息流设为仅显示您的图片的HTML文件。丢失了图像字节流,必须将图像写入磁盘。

答案 3 :(得分:0)

我不知道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";
}

不知道这个解决方案是否优雅,但我想不是。我不能确定的借口是深夜。 :)

参考文献:

答案 4 :(得分:0)

IE仅支持32KB用于base64编码的内嵌图像,因此不是一个好的解决方案。

答案 5 :(得分:0)

尝试res:协议。

我没有尝试使用.net dll,但是this帖子说它应该有效。即使它确实需要一个C ++ DLL,它的编写也会更加简单。

我创建了一个帖子,向您展示如何here向您展示如何创建资源脚本并正确使用 res:协议。