Глубокое увеличение – база данных Silverlight - Проект DeepZoomSilverlight

ОГЛАВЛЕНИЕ

Проект DeepZoomSilverlight

Этот проект Silverlight состоит из одной страницы, отображающей изображение с глубоким увеличением и отображающей доступные изображения из базы данных в окне списка. Спрашивается, как управляющий элемент MultiScaleImage отображает мозаику, хранящуюся в базе данных? Обычно свойству Source этого управляющего элемента присваивается универсальный код ресурса (URI) для файла XML, например, нечто вроде msi.Source="../GeneratedImages/dzc_output.xml". На(о?) это свойство на самом деле имеет тип MultiScaleTileSource.

Создается класс, унаследованный от MultiScaleTileSource и реализующий его интерфейс. Главный метод этого класса называется GetTileLayers и вызывается из управляющего элемента MultiScaleImage для каждого требуемого элемента мозаики. Внутри этого метода каждый элемент мозаики добавляется в список, но не в виде растрового изображения, а в виде URI. Затем сам URI должен передать изображение обратно, и поэтому в веб-проекте используется HttpHandler.

/// <summary>
/// Получает набор элементов мозаики, образующий изображение с глубоким увеличением.
/// </summary>
/// <param name="tileLevel">Уровень заголовка.</param>
/// <param name="tilePositionX">X-координата позиции заголовка.</param>
/// <param name="tilePositionY">Y-координата позиции заголовка.</param>
/// <param name="tileImageLayerSources">Источник изображения заголовка.</param>
protected override void GetTileLayers(int tileLevel, int tilePositionX,
                                      int tilePositionY,
                                      IList<object> tileImageLayerSources)
{
    string source =
        string.Format(
                      "TileHandler.ashx?tileLevel={0}&tilePositionX={1}&" +
                      "tilePositionY={2}&imageId={3}&contentType={4}",
                      tileLevel, tilePositionX, tilePositionY, imageId, mimeType);

    var uri = new Uri(HtmlPage.Document.DocumentUri, source);

    tileImageLayerSources.Add(uri);
}

HttpHandler не входит в проект Silverlight, а является частью приложения ASP.NET, в котором размещается приложение Silverlight. Необходим такой вид архитектуры, потому что сам Silverlight не способен подключиться к базе данных, поскольку он работает в безопасной среде-песочнице.

Веб-проект DeepZoomSilverlight

Это приложение ASP.NET, в котором размещается управляющий элемент Silverlight. Данное приложение также предоставляет данные управляющему элементу Silverlight. В этом приложение есть два HttpHandler: первый возвращает элементы мозаики в виде растровых изображений, а второй возвращает эскиз для конкретного изображения. К тому же, определена служба WCF, которую приложение Silverlight использует для извлечения информации об изображениях.

public void ProcessRequest(HttpContext context)
{
    if (context.Request.QueryString.HasKeys())
    {
        // Лень...
        int imageId = int.Parse(context.Request.QueryString.Get("imageId"));
        int tileLevel = int.Parse(context.Request.QueryString.Get("tileLevel"));
        int tilePosX = int.Parse(context.Request.QueryString.Get("tilePositionX"));
        int tilePosY = int.Parse(context.Request.QueryString.Get("tilePositionY"));
        string contentType = context.Request.QueryString.Get("contentType");

        context.Response.ContentType = contentType;
        System.Drawing.Bitmap bitmap = GetTile(imageId, tileLevel, tilePosX,
            tilePosY);

        if (bitmap != null)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            if (contentType.Contains("png"))
                bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            else
                bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.WriteTo(context.Response.OutputStream);
        }
    }
}

private Bitmap GetTile(int imageId, int level, int x, int y)
{
    try
    {
        DzDbAccess accessDb = DeepZoomSilverlightWeb.Helper.GetAccessDb();
        Bitmap bmp = accessDb.GetImageTile(imageId, level, x, y);
        accessDb.DbConnection.Close();
        return bmp;
    }
    catch (Exception)
    {
        return null;
    }
}

Интересные особенности

После обзора разных проектов, входящих в решение, и объяснения самых важных моментов дается дополнительная ценная информация о коде.

Формат файла с глубоким увеличением

Эта статья не была бы полной без нескольких слов о формате файла с глубоким увеличением. Но нет смысла повторять то, что Microsoft подробно описала в MSDN.

Структура базы данных

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