Pregunta

¿Alguien sabe en .Net 2.0 - .Net 3.5 cómo cargar un jpeg en un System.Windows.Forms.WebControl como una matriz de bytes y con los tipos de mime correctos establecidos para que se muestre?

Algo así como:

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

El webBrowser1.DocumentType parece ser de solo lectura, por lo que no sé cómo hacerlo. En general, quiero poder cargar cualquier tipo de fuente de archivos con un tipo MIME definido en el navegador para mostrarlo.

Las soluciones para escribir archivos temporales no son buenas. Actualmente lo he resuelto con un pequeño oyente de socket de servidor web local que entrega el jpeg que solicito con el tipo mime correcto.

ACTUALIZACIÓN: Dado que alguien eliminó una pregunta de responder mi propia pregunta en la que tenía información que otros podrían usar, la agregaré como una actualización. (para aquellos que eliminan de esa manera, actualice las preguntas con la información importante).

Solución de muestra en C # aquí que funciona perfectamente: http: //www.codeproject. com / KB / aspnet / AspxProtocol.aspx

¿Fue útil?

Solución

Debe implementar un protocolo asíncrono conectable, p. IClassFactory, IInternetProtocol ... Luego usa CoInternetGetSession para registrar su protocolo. Cuando IE llama a su implementación, puede servir sus datos de imagen desde la memoria / proporcionar el tipo mime.

Es un poco tedioso, pero factible. Consulte IInternetProtocol y la documentación de protocolos conectables en MSDN .

Otros consejos

No puedes hacerlo. No puede introducir imágenes en el control del navegador web de Microsoft.

La limitación proviene del control IWebBrowser en sí, que .NET concluye.

Si desea un hackeo total, intente que su transmisión sea el archivo HTML que solo muestra su imagen. Pierde su flujo de bytes de imagen y tendrá que escribir la imagen en el disco.

No sé si el control WebBrowser .NET lo admite, pero RFC2397 define cómo usar imágenes en línea. Usando esto y un fragmento XHTML creado sobre la marcha, posiblemente podría asignar la imagen sin la necesidad de escribirla en un archivo.

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";
}

No tengo idea si esta solución es elegante, pero supongo que no lo es. Mi excusa para no estar seguro es que es tarde en la noche. :)

Referencias: