代码之家  ›  专栏  ›  技术社区  ›  Wolf5

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

  •  4
  • Wolf5  · 技术社区  · 16 年前

    在.NET 2.0-.NET 3.5中,是否有人知道如何将jpeg作为字节数组加载到system.windows.forms.webcontrol中,并且设置了正确的mimetype以便显示它?

    类似:

    webBrowser1.DocumentStream = new MemoryStream(File.ReadAllBytes("mypic.jpg"));
    webBrowser1.DocumentType = "application/jpeg";
    

    webbrowser1.documenttype似乎是只读的,因此我不知道如何执行此操作。一般来说,我希望能够将定义了mimetype的任何类型的文件源加载到浏览器中以显示它。

    编写临时文件的解决方案并不好。目前,我已经解决了这个问题,因为我有一个小型的本地WebServer Socket监听器,它可以用正确的mimetype传递我所要求的jpeg。

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

    C中的样品溶液非常有效: http://www.codeproject.com/KB/aspnet/AspxProtocol.aspx

    6 回复  |  直到 10 年前
        1
  •  5
  •   liggett78    16 年前

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

    这有点乏味,但可行。查看iInternetProtocol和Pluggable Protocol文档 MSDN .

        2
  •  0
  •   Ian Boyd    16 年前

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

    限制来自iWebBrowser控件本身,.NET将其包装起来。

        3
  •  0
  •   Austin Salonen gmlacrosse    16 年前

    如果你想要一个完全的黑客,尝试让你的流成为只显示你的图片的HTML文件。您将丢失图像字节流,并且必须将图像写入磁盘。

        4
  •  0
  •   hangy    16 年前

    我不知道 webbrowser-.net control是否支持此功能,但是 rfc2397->a>定义如何使用内联图像。使用这个和动态创建的XHTML片段,您可以分配图像,而无需将其写入文件。

    image someimage=image.fromfile(“mypic.jpg”);
    
    //首先,获取图像作为base64编码字符串
    ImageConverter ImageConverter=新建ImageConverter();
    byte[]buffer=(byte[])imageconverter.convertto(someimage,typeof(byte[]);
    string base64=convert.tobase64string(缓冲区,base64formattingoptions.insertlinebreaks);
    
    //然后,为此动态地创建一些XHTML(因为这只是一个示例,最低限度的XHTML:d)
    字符串html=“<img src=\”data:image/”。someImage.rawFormat.toString()。Base64$64。“& gt”;
    
    //并将其放入某个流中
    使用(streamwriter streamwriter=new streamwriter(new memoryStream())
    {
    streamwriter.write(html);
    streamwriter.flush();
    webbrowser.documentstream=streamwriter.basestream;
    webbrowser.documenttype=“文本/html”;
    }
    < /代码> 
    
    

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

    参考文献:

    定义如何使用内嵌图像。使用这个和一个动态创建的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";
    }
    

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

    参考文献:

        5
  •  0
  •   Seeker    15 年前

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

        6
  •  0
  •   Community CDub    7 年前

    试试 res: 协议。

    我没有用.NET DLL尝试过,但是 this 波斯特说这应该有效。即使它确实需要一个C++ DLL,但就编码而言,它使用起来要简单得多。

    我写了一篇文章告诉你 here 这将向您展示如何创建资源脚本并使用 物件: 协议正确。