Почему объект WPF BitmapImage не загружает изображение из источника Uri в веб-формах ASP.Net? - PullRequest
3 голосов
/ 10 февраля 2009

Я пытаюсь сделать следующее в ASP.Net:

  1. Создание элемента управления WPF Canvas
  2. Раскрутите элемент управления WPF Image и объект BitmapImage
  3. Установите для источника BitmapImage значение Uri для изображения
  4. Добавить изображение на холст
  5. Когда изображение загружено, визуализируйте холст на новом растровом изображении

Мой код работает правильно в самом WPF, однако при запуске на странице ASP.Net изображение не загружается.

Он отлично работает для других элементов интерфейса WPF. В случае Image использование свойства BitmapImage.StreamSource для задания источника работает правильно. Когда я использую свойство BitmapImage.UriSource, событие BitmapImage.DownloadCompleted не возникает, что указывает на то, что изображение никогда не начинает загружаться в первую очередь.

Важно отметить, что он отлично работает для большинства элементов управления - эллипсов, прямоугольников, презентеров чернил, а также для элемента управления изображением, если я использую источник потока, а не источник URI.

Итак, что мне здесь не хватает? Почему класс BitmapImage ведет себя по-разному в сети приложение?

Я знаю, что меня спросят, поэтому цель в том, чтобы я написал клиент Silverlight для создания графического контента, который хранится на веб-сервере. Я хочу, чтобы веб-сервер отображал содержимое в растровые файлы.

Заранее спасибо за любые советы.

Вот мой код для страницы ASP.Net:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Threading;
using System.Windows;
using System.Net;
using System.IO;
using System.Windows.Media;

public partial class _Default : System.Web.UI.Page 
{
    private static Canvas c;
    protected void Page_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(
            delegate { DownloadAndSave(); }));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
    }

    [STAThread]
    void DownloadAndSave()
    {
        c = new Canvas();
        BitmapImage bitmap = new BitmapImage();
        System.Windows.Controls.Image image = new System.Windows.Controls.Image();

        bitmap.DownloadCompleted += new EventHandler(bitmap_DownloadCompleted);
        bitmap.BeginInit();
        bitmap.UriSource = new Uri("http://andrew.myhre.tanash.net/customassets/andrewmyhre/image/face.jpg");
        bitmap.EndInit();

        image.Source = bitmap;

        c.Children.Add(image);

        c.UpdateLayout();
        c.Measure(new Size(400, 300));
        c.Arrange(new Rect(new Size(400, 300)));
    }

    void bitmap_DownloadCompleted(object sender, EventArgs e)
    {
        // this never fires!!
        SaveImage(c);
    }

    void SaveImage(UIElement element)
    {
        RenderTargetBitmap bmp = new RenderTargetBitmap(400, 300, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(element);
        BitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));
        using (Stream stm = File.Create(Server.MapPath("~/file.jpg")))
            encoder.Save(stm);
    }
}

Ответы [ 2 ]

2 голосов
/ 08 мая 2009

Я думаю, что событие DownloadCompleted никогда не вызывается, потому что BitmapImage загружается асинхронно, когда вы используете свойство UriSource, которое позволяет фоновому потоку (метод DownloadAndSave) завершиться до загрузки изображения.

В последнее время в почти идентичной ситуации у меня сработало синхронное скачивание растрового ресурса и установка его с помощью свойства BitmapImage.StreamSource. Обратите внимание, что при использовании этой техники нельзя закрывать / удалять поток до тех пор, пока вы не отобразите RenderTargetBitmap.

1 голос
/ 10 февраля 2009

Проверяли ли вы, что добавление атрибута STAThread в метод DownloadAndSave на самом деле заставляет его работать в потоке STA?

В соответствии с документацией атрибута STAThreadAttribute (http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx) он не оказывает никакого влияния на другие методы, чем основной метод ввода, например, Main в приложении WinForms.

Полагаю, вы должны смотреть в этом направлении - у меня были похожие проблемы с функциями изображений WPF, для которых требовался STA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...