Как получить элемент управления C # WebBrowser для отображения файлов JPEG (сырье)? - PullRequest
4 голосов
/ 14 ноября 2008

Кто-нибудь знает в .Net 2.0 - .Net 3.5, как загрузить jpeg в System.Windows.Forms.WebControl в виде байтового массива и с правильными установленными типами mimety, чтобы он отображался?

Что-то вроде:

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

Кажется, webBrowser1.DocumentType доступен только для чтения, поэтому я не знаю, как это сделать. В общем, я хочу иметь возможность загружать любой тип файлового источника с mime-типом, определенным в браузере, чтобы показать его.

Решения с написанием временных файлов не очень хорошие. В настоящее время я решил эту проблему с помощью небольшого локального прослушивателя сокетов веб-сервера, который поставляет jpeg, который я запрашиваю, с правильным mimetype.

ОБНОВЛЕНИЕ: Поскольку кто-то удалил вопрос с ответом на свой вопрос, где у меня была информация, которую другие могли бы использовать, я добавлю ее в качестве обновления. (тем, кто удаляет этот путь, пожалуйста, обновите вопросы с важной информацией).

Пример решения на C # здесь отлично работает: http://www.codeproject.com/KB/aspnet/AspxProtocol.aspx

Ответы [ 6 ]

5 голосов
/ 15 ноября 2008

Вы должны реализовать асинхронный подключаемый протокол, например, IClassFactory, IInternetProtocol ... Затем вы используете CoInternetGetSession для регистрации вашего протокола. Когда IE вызывает вашу реализацию, вы можете передавать данные изображения из памяти / предоставлять mime-тип.

Это немного утомительно, но выполнимо. Посмотрите документацию IInternetProtocol и подключаемых протоколов на MSDN .

0 голосов
/ 28 марта 2013

Попробуйте протокол res:.

Я не пробовал его с .net dll, но в этом сообщении говорится, что оно должно работать. Даже если для этого требуется C ++ dll, его гораздо проще использовать для кодирования.

Я создал пост, в котором показано, как здесь , где показано, как создать скрипт ресурса и правильно использовать протокол res: .

0 голосов
/ 07 ноября 2009

IE поддерживает только 32 КБ для встроенных изображений в кодировке base64, поэтому не очень хорошее решение.

0 голосов
/ 15 ноября 2008

Я не знаю, поддерживает ли это элемент управления 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";
}

Не знаю, изящно ли это решение, но, думаю, это не так. Мое оправдание за то, что я не уверен, что это поздно ночью. :)

Ссылки:

0 голосов
/ 15 ноября 2008

Если вам нужен тотальный хак, попробуйте, чтобы ваш поток был HTML-файлом, который показывает только вашу картинку. Вы теряете свой поток байтов изображения и должны будете записать изображение на диск.

0 голосов
/ 14 ноября 2008

Вы не можете сделать это. Вы не можете вставлять изображения в элемент управления веб-браузера Microsoft.

Ограничение исходит от самого элемента управления IWebBrowser, который закрывает .NET.

...