4

有谁知道 .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

4

6 回答 6

5

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

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

于 2008-11-15T20:31:08.183 回答
0

你做不到。您不能将图像填充到 Microsoft 的网络浏览器控件中。

限制来自 .NET 封装的 IWebBrowser 控件本身。

于 2008-11-14T18:45:03.483 回答
0

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

于 2008-11-14T22:27:19.027 回答
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";
}

不知道这个解决方案是否优雅,但我想不是。我不确定的借口是已经很晚了。:)

参考:

于 2008-11-15T00:12:40.407 回答
0

IE 只支持 base64 编码的内联图像 32KB,所以不是一个好的解决方案。

于 2009-11-07T10:20:33.693 回答
0

尝试res:协议。

我没有尝试过使用 .net dll,但这篇文章说它应该可以工作。即使它确实需要 C++ dll,就编码而言,它的使用要简单得多。

我创建了一篇文章,向您展示如何在这里展示如何创建资源脚本并正确使用res:协议。

于 2013-03-28T01:16:18.440 回答