2010-05-25 1 views
1

Как показать изображение base64, закодированное с помощью элемента управления WebBrowser на C#?Как отобразить схему uri данных в C# WebBrowser Controller

Я использовал следующий код:

<img src="data:image/gif;base64,/9j/4AAQSkZJRgABAgAAZABkAA7AAR 
R894ADkFkb2JlAGTAAAAAAfbAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBw 
... 
uhWkvoJfQO2z/rf4VpL6CX0Dts/63+FaS+gl9A7bP+tthWkvoJfQODCde4qfcg 
RiNWK3UyUeX9CXpHU43diOK915X5fG/reux5hUAUBftZ" /> 

, но не отображается изображение. Одним из решений было бы сохранить изображения локально и использовать абсолютный путь, но это нежелательно.

Любая идея?

ответ

0

Я попытался сделать это для проекта, и IE (который в конечном итоге использует элемент управления WebBrowser) стал ограничивающим фактором - он может содержать только изображения размером 32 КБ. Мне пришлось создать HTTP-обработчик (.ashx), который вернул изображение на основе ключа базы данных.

Редактировать: пример - обратите внимание, что процедуры обработки базы данных являются собственностью, и вам придется поместить их самостоятельно. Остальная часть обработчика будет показано, как изменить масштаб изображения (при желании) и отправить обратно в ответ на браузер:

public class GenerateImage : IHttpHandler 
{ 
    /// <summary> 
    /// Shortcut to the database controller. Instantiated immediately 
    /// since the ProcessRequest method uses it. 
    /// </summary> 
    private static readonly IDataModelDatabaseController controller = 
     DataModelDatabaseControllerFactory.Controller; 

    /// <summary> 
    /// Enables processing of HTTP Web requests by a custom HttpHandler 
    /// that implements the <see cref="T:System.Web.IHttpHandler"/> 
    /// interface. 
    /// </summary> 
    /// <param name="context">An <see cref="T:System.Web.HttpContext"/> 
    /// object that provides references to the intrinsic server objects 
    /// (for example, Request, Response, Session, and Server) used to 
    /// service HTTP requests.</param> 
    public void ProcessRequest(HttpContext context) 
    { 
     if (controller == null) 
     { 
      return; 
     } 

     IDataModelDescriptor desc = controller.GetDataModelDescriptor(
      new Guid(context.Request.QueryString["dataModel"])); 
     IDataModelField imageField = 
      desc.Fields[context.Request.QueryString["imageField"]]; 
     IDatabaseSelectQuery query = controller.CreateQuery(); 
     string[] keys = context.Request.QueryString["key"].Split(','); 
     string showThumb = context.Request.QueryString["showThumbnail"]; 
     bool showThumbnail = showThumb != null; 

     query.AssignBaseTable(desc); 
     query.AddColumn(imageField, false); 
     for (int i = 0; i < desc.KeyFields.Count; i++) 
     { 
      query.AddCompareValue(
       desc.KeyFields[i], 
       keys[i], 
       DatabaseOperator.Equal); 
     } 

     context.Response.CacheControl = "no-cache"; 
     context.Response.ContentType = "image/jpeg"; 
     context.Response.Expires = -1; 

     byte[] originalImage = (byte[])controller.ExecuteScalar(query); 

     if (showThumbnail) 
     { 
      int scalePixels; 

      if (!int.TryParse(showThumb, out scalePixels)) 
      { 
       scalePixels = 100; 
      } 

      using (Stream stream = new MemoryStream(originalImage)) 
      using (Image img = Image.FromStream(stream)) 
      { 
       double multiplier; 

       if ((img.Width <= scalePixels) 
        && (img.Height <= scalePixels)) 
       { 
        context.Response.BinaryWrite(originalImage); 
        return; 
       } 
       else if (img.Height < img.Width) 
       { 
        multiplier = (double)img.Width/(double)scalePixels; 
       } 
       else 
       { 
        multiplier = (double)img.Height/(double)scalePixels; 
       } 

       using (Bitmap finalImg = new Bitmap(
        img, 
        (int)(img.Width/multiplier), 
        (int)(img.Height/multiplier))) 
       using (Graphics g = Graphics.FromImage(finalImg)) 
       { 
        g.InterpolationMode = 
         InterpolationMode.HighQualityBicubic; 
        finalImg.Save(
         context.Response.OutputStream, 
         ImageFormat.Jpeg); 
       } 
      } 
     } 
     else 
     { 
      context.Response.BinaryWrite(originalImage); 
     } 
    } 

    /// <summary> 
    /// Gets a value indicating whether another request can use the 
    /// <see cref="T:System.Web.IHttpHandler"/> instance. 
    /// </summary> 
    /// <value></value> 
    /// <returns>true if the <see cref="T:System.Web.IHttpHandler"/> 
    /// instance is reusable; otherwise, false. 
    /// </returns> 
    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

проблема заключается мое приложение не прописан в asp.net, и я использую WebBrowser Controler из C#. Как я могу выполнить функцию ProcessRequest? – Emanuel

+0

Я думаю, вам придется пойти с вашей нежелательной возможностью иметь изображения на локальном пути. Если вы не сможете разместить их централизованно и получить доступ к ним через сеть через UNC-путь или на веб-сервере, доступном по http. –

0

Что такое данные длина строки uri, в соответствии с data Protocol in IE8 Данные URI не могут превышать 32 768 символов.

Редактировать: Данные ресурса должны быть правильно закодированы; в противном случае возникает ошибка, и ресурс не загружается. Символы «#» и «%» должны быть закодированы, а также управляющие символы, неамериканские символы ASCII и многобайтовые символы.

 Смежные вопросы

  • Нет связанных вопросов^_^