Как отобразить схему URI данных в C # WebBrowser Controller - PullRequest
1 голос
/ 25 мая 2010

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

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

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

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 мая 2010

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

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

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 голосов
/ 25 мая 2010

Что такое длина строки данных uri, согласно Протокол данных в IE8 URI данных не может быть длиннее 32 768 символов.

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

...